Studocu
Find Studocu study documents, courses and institutions, and manage study projects and quizzes.
我该使用它吗
质量与安全性
发现(23)
- HIGH
- LOW在 write-memory 中
- LOW在 search-documents 中
- LOW在 search-institutions 中
- LOW在 search-courses 中
- LOW在 search-web 中
- LOW在 get-course-syllabus 中
- LOW在 agent-os-session 中
- LOW在 read-web-url 中
- LOW在 read-artifact 中
基于对工具定义和协议合规性的自动分析。
上下文开销
这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。
安装
一键安装
将以下内容添加到你的 `claude_desktop_config.json` 文件中:
{
"mcpServers": {
"studocu": {
"url": "https://agent-os-mcp.alpha.studocu.com/mcp"
}
}
}远程端点
https://agent-os-mcp.alpha.studocu.com/mcpstreamable-http它能做什么
工具清单
工具(20)
🟢search-documents(query, institution, course, course_id, limit)
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. For open-web sources outside Studocu, use search-web instead.
输入模式
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"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."
},
"institution": {
"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.",
"type": "string"
},
"course": {
"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.",
"type": "string"
},
"course_id": {
"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.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 2147483647
},
"limit": {
"default": 10,
"description": "Number of results to return (1-50, default: 10).",
"type": "integer",
"minimum": 1,
"maximum": 50
}
},
"required": [
"query"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"documents": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"course": {
"type": "string"
},
"institution": {
"type": "string"
},
"url": {
"type": "string"
},
"ratingPositive": {
"type": "number"
},
"ratingNegative": {
"type": "number"
},
"publishedAt": {
"type": "string"
},
"academicYears": {
"type": "array",
"items": {
"type": "number"
}
},
"description": {
"type": "string"
},
"numberOfPages": {
"type": "number"
},
"language": {
"type": "string"
}
},
"required": [
"id",
"url"
],
"additionalProperties": false
}
}
},
"required": [
"documents"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢search-institutions(query, limit, type)
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.
输入模式
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"limit": {
"default": 3,
"type": "integer",
"minimum": 1,
"maximum": 10
},
"type": {
"type": "string",
"enum": [
"UNIVERSITY",
"HIGH_SCHOOL"
]
}
},
"required": [
"query"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"institutions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"name": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"UNIVERSITY",
"HIGH_SCHOOL"
]
},
"region_code": {
"type": "string"
},
"country": {
"type": "string"
}
},
"required": [
"id",
"name",
"type",
"region_code",
"country"
],
"additionalProperties": false
}
}
},
"required": [
"institutions"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢search-courses(query, institution_id, limit)
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.
输入模式
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"institution_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 2147483647
},
"limit": {
"default": 3,
"type": "integer",
"minimum": 1,
"maximum": 10
}
},
"required": [
"query"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"courses": {
"type": "array",
"items": {
"type": "object",
"properties": {
"course_id": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"name": {
"type": "string"
},
"code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"institution_id": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"institution_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"course_id",
"name",
"code",
"institution_id"
],
"additionalProperties": false
}
}
},
"required": [
"courses"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢search-web(query, site)
Answer open-web questions with a grounded response and citation URLs (news, reference sites, documentation). Use this for non-Studocu sources. For Studocu study documents, lecture notes, summaries, or course materials, use search-documents instead. Competitor study-material domains are excluded from results.
输入模式
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"maxLength": 7500,
"description": "Open-web question or search prompt (external sources only). For Studocu study documents, lecture notes, or course materials use search-documents instead."
},
"site": {
"description": "Optional domain filter, e.g. \"rijksoverheid.nl\". Restricts search to that site when supported.",
"type": "string",
"minLength": 1,
"maxLength": 1000
}
},
"required": [
"query"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "Grounded answer text, including inline citation links when present."
},
"citations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"domain": {
"type": "string"
}
},
"required": [
"title",
"url",
"domain"
],
"additionalProperties": false
},
"description": "Sources used for the answer, with title, URL, and domain."
}
},
"required": [
"text",
"citations"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢get-course-syllabus(course_id)
Return a generated course outline as markdown when this tool has one. This is the best grounding for high-quality study guidance. Requires course_id.
输入模式
{
"type": "object",
"properties": {
"course_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Studocu course id whose published syllabus should be loaded."
}
},
"required": [
"course_id"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"course_id": {
"type": "string",
"minLength": 1,
"description": "Course id whose published syllabus was loaded."
},
"content": {
"type": "string",
"description": "Published syllabus text for this course."
}
},
"required": [
"course_id",
"content"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢agent-os-session
Use this proof tool to verify that the Agent OS MCP server received a valid delegated Studocu session.
输入模式
{
"type": "object",
"properties": {},
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"authenticated": {
"type": "boolean"
},
"subject": {
"type": "string"
},
"clientId": {
"type": "string"
},
"scopes": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"authenticated",
"clientId",
"scopes"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢read-web-url(url, query)
Read a specific public URL and return grounded page content for agent evidence. Use this when you already have the exact URL. For Studocu study documents use search-documents; for open-web discovery use search-web. Competitor study-material hosts are rejected.
输入模式
{
"type": "object",
"properties": {
"url": {
"type": "string",
"minLength": 1,
"maxLength": 2000,
"format": "uri",
"description": "Public http or https URL to read for agent evidence. For Studocu study documents use search-documents; for open-web discovery use search-web."
},
"query": {
"description": "Optional focus question or extraction instruction for the page content.",
"type": "string",
"minLength": 1,
"maxLength": 7500
}
},
"required": [
"url"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "Grounded text extracted from the URL for agent use."
},
"url": {
"type": "string",
"format": "uri",
"description": "The requested URL that was read."
}
},
"required": [
"text",
"url"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢read-artifact(artifact_id, cursor)
Read a Studocu project source or creation by its studocu://project/{project_id}/{kind}/{uuid} URI. Returns normalized metadata with explicitly mapped inline content.
输入模式
{
"type": "object",
"properties": {
"artifact_id": {
"type": "string",
"minLength": 1,
"description": "Artifact URI in the form studocu://project/{project_id}/{kind}/{uuid}."
},
"cursor": {
"description": "Opaque continuation cursor returned by a previous read.",
"type": "string",
"minLength": 1
}
},
"required": [
"artifact_id"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"artifactId": {
"type": "string"
},
"projectId": {
"type": "string"
},
"details": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"source",
"creation"
]
},
"id": {
"type": "string",
"format": "uuid",
"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)$",
"description": "NOTE: These shared primitives are copied from the AI API spec and owned\nlocally by Agent OS to keep this contract decoupled."
},
"title": {
"type": "string"
},
"status": {
"anyOf": [
{
"type": "string",
"enum": [
"pending",
"processing",
"ready",
"completed",
"failed"
]
},
{
"type": "string",
"enum": [
"creating",
"created",
"failed"
]
}
]
},
"type": {
"type": "string"
},
"folder": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"content": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Use this ID to fetch the Quiz from the Rest API."
},
"title": {
"type": "string"
},
"count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"questions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "string"
}
]
},
"title": {
"type": "string"
},
"body": {
"type": "string"
},
"text": {
"type": "string"
},
"type": {
"type": "string"
},
"difficulty": {
"type": "string"
},
"question": {
"type": "string"
},
"explanation": {
"type": "string"
},
"explanationMd": {
"type": "string"
},
"correctAnswer": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "string"
}
]
},
"correctAnswerIds": {
"type": "array",
"items": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "string"
}
]
}
},
"options": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "string"
}
]
},
"text": {
"type": "string"
},
"correct": {
"type": "boolean"
},
"isCorrect": {
"type": "boolean"
}
},
"required": [
"id",
"text"
],
"additionalProperties": false
}
},
"answers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "string"
}
]
},
"answer": {
"type": "string"
},
"isCorrect": {
"type": "boolean"
}
},
"required": [
"id",
"answer",
"isCorrect"
],
"additionalProperties": false
}
}
},
"additionalProperties": false
}
}
},
"required": [
"id",
"title",
"count",
"questions"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"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)$",
"description": "Use this ID to fetch the Mock Exam from the API."
},
"hasPdf": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"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)$",
"description": "Use this ID to fetch the Mock Exam from the API."
},
"schemaVersion": {
"type": "string"
},
"title": {
"type": "string"
},
"frontMatter": {
"type": "object",
"properties": {
"instructionsMarkdown": {
"type": "string"
}
},
"additionalProperties": false
},
"content": {
"type": "array",
"items": {
"anyOf": [
{
"allOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"section"
]
},
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"questionType": {
"type": "string"
},
"instructions": {
"type": "string"
}
},
"required": [
"kind",
"id",
"questionType"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "section"
}
},
"required": [
"kind"
],
"additionalProperties": false
}
]
},
{
"allOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"stimulus"
]
},
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"stimulusMarkdown": {
"type": "string"
}
},
"required": [
"kind",
"id",
"stimulusMarkdown"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "stimulus"
}
},
"required": [
"kind"
],
"additionalProperties": false
}
]
},
{
"allOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"question"
]
},
"id": {
"type": "string"
},
"sectionId": {
"type": "string"
},
"type": {
"type": "string"
},
"marks": {
"type": "number"
},
"questionMarkdown": {
"type": "string"
},
"stimulusIdRefs": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
]
},
"options": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "string"
}
]
},
"text": {
"type": "string"
}
},
"required": [
"id",
"text"
],
"additionalProperties": false
}
},
"templateMarkdown": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"blanks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
}
},
"grading": {
"type": "object",
"properties": {
"correctAnswerIds": {
"type": "array",
"items": {
"type": "string"
}
},
"correctAnswer": {
"type": "string"
},
"modelAnswer": {
"type": "string"
},
"keyPoints": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"modelAnswer"
],
"additionalProperties": false
},
"topics": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"id",
"sectionId",
"type",
"marks",
"questionMarkdown"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "question"
}
},
"required": [
"kind"
],
"additionalProperties": false
}
]
}
]
}
}
},
"required": [
"id",
"schemaVersion",
"title",
"content"
],
"additionalProperties": false
}
},
"required": [
"id",
"hasPdf",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"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)$",
"description": "Use this ID to fetch the lesson metadata from the API."
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"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)$",
"description": "Use this ID to fetch the lesson metadata from the API."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"outline": {
"type": "object",
"properties": {
"learning_goal": {
"type": "string"
},
"title": {
"type": "string"
},
"exercises": {
"type": "array",
"items": {
"type": "object",
"properties": {
"exercise_id": {
"type": "string"
},
"topic_id": {
"type": "string"
},
"title": {
"type": "string"
}
},
"required": [
"exercise_id",
"title"
],
"additionalProperties": false
}
}
},
"required": [
"learning_goal",
"title",
"exercises"
],
"additionalProperties": false
},
"exercises": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"position": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"title": {
"type": "string"
},
"concept_explanation": {
"type": "object",
"properties": {
"paragraph1": {
"type": "string"
},
"paragraph2": {
"type": "string"
}
},
"required": [
"paragraph1",
"paragraph2"
],
"additionalProperties": false
},
"mcq": {
"type": "array",
"items": {
"type": "object",
"properties": {
"question": {
"type": "string"
},
"options": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "string"
}
]
},
"text": {
"type": "string"
}
},
"required": [
"id",
"text"
],
"additionalProperties": false
}
}
},
"required": [
"question",
"options"
],
"additionalProperties": false
}
},
"open_ended": {
"type": "object",
"properties": {
"question": {
"type": "string"
}
},
"required": [
"question"
],
"additionalProperties": false
}
},
"required": [
"id",
"position",
"title",
"concept_explanation",
"mcq",
"open_ended"
],
"additionalProperties": false
}
}
},
"required": [
"id",
"title",
"description",
"outline",
"exercises"
],
"additionalProperties": false
}
},
"required": [
"id",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"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)$",
"description": "Use this ID to fetch the flashcard set from the API."
},
"data": {
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"description": {
"type": "string"
},
"flashcards": {
"type": "array",
"items": {
"type": "object",
"properties": {
"front": {
"type": "string",
"minLength": 1
},
"back": {
"type": "string",
"minLength": 1
}
},
"required": [
"front",
"back"
],
"additionalProperties": false
}
}
},
"required": [
"title",
"description",
"flashcards"
],
"additionalProperties": false
}
},
"required": [
"id",
"data"
],
"additionalProperties": false
},
{
"type": "string"
}
]
},
"createdAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"updatedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
{
"type": "null"
}
]
},
"category": {
"anyOf": [
{
"type": "string",
"enum": [
"file/audio",
"file/image",
"file/pdf",
"file/markdown",
"studocu/document"
]
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"id",
"title",
"status",
"type",
"folder",
"content",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"continuations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"path": {
"type": "string",
"enum": [
"details.content.questions"
]
},
"returned": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"total": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"hasMore": {
"type": "boolean"
},
"nextCursor": {
"type": "string",
"minLength": 1
}
},
"required": [
"path",
"returned",
"total",
"hasMore"
],
"additionalProperties": false
}
}
},
"required": [
"artifactId",
"projectId",
"details"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢read-detached-document(document_id)
Read a Studocu document directly, without requiring or creating a project source. Use read-artifact for documents attached to a project.
输入模式
{
"type": "object",
"properties": {
"document_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Studocu document ID to read without creating a project source."
}
},
"required": [
"document_id"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"content": {
"type": "string",
"description": "The raw full text content of the Studocu document."
}
},
"required": [
"content"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢get-context(project_id, course_id, recent_only, active_only)
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.
输入模式
{
"type": "object",
"properties": {
"project_id": {
"description": "Narrow context to a single project by id.",
"type": "string",
"minLength": 1
},
"course_id": {
"description": "Narrow context to a single followed course and its projects.",
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
]
},
"recent_only": {
"description": "Limit the manifest to recently active context.",
"type": "boolean"
},
"active_only": {
"description": "Limit the manifest to active context.",
"type": "boolean"
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"context_schema_version": {
"type": "number",
"const": 1
},
"generated_at": {
"type": "string"
},
"requested_filters": {
"type": "object",
"properties": {
"project_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"course_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"recent_only": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"active_only": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
}
},
"required": [
"project_id",
"course_id"
],
"additionalProperties": false
},
"data": {
"type": "object",
"properties": {
"profile": {
"type": "object",
"properties": {
"first_name": {
"type": "string"
},
"last_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"locale": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"study_year": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"level": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"gender": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"stage": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"institution": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"type",
"name"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"first_name",
"last_name",
"locale",
"study_year",
"level",
"gender",
"stage",
"institution"
],
"additionalProperties": false
},
"followed_courses": {
"type": "array",
"items": {
"type": "object",
"properties": {
"course_id": {
"type": "string"
},
"name": {
"type": "string"
},
"institution_id": {
"type": "string"
}
},
"required": [
"course_id",
"name"
],
"additionalProperties": false
}
},
"memory": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string"
},
"value": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"updated_at": {
"type": "string"
}
},
"required": [
"kind",
"value"
],
"additionalProperties": false
}
},
"projects": {
"type": "array",
"items": {
"type": "object",
"properties": {
"project_id": {
"type": "string"
},
"metadata": {
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"is_mobile": {
"type": "boolean"
},
"emoji": {
"type": "string",
"minLength": 1
},
"course_id": {
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"institution_id": {
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"course_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"thread_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"pending_sources_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"pending_creations_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"title",
"is_mobile",
"emoji",
"course_id",
"institution_id"
],
"additionalProperties": false
},
"memory": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string"
},
"value": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"updated_at": {
"type": "string"
}
},
"required": [
"kind",
"value"
],
"additionalProperties": false
}
},
"has_course_mastery": {
"type": "boolean"
},
"started_course_mastery": {
"type": "boolean"
},
"topic_masteries": {
"type": "array",
"items": {
"type": "object",
"properties": {
"topic_id": {
"type": "string",
"minLength": 1
},
"topic_name": {
"type": "string",
"minLength": 1
},
"mastery": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"questions_answered": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"topic_id",
"mastery",
"questions_answered"
],
"additionalProperties": false
}
}
},
"required": [
"project_id",
"metadata",
"memory",
"has_course_mastery",
"started_course_mastery"
],
"additionalProperties": false
}
}
},
"required": [
"profile",
"followed_courses",
"memory",
"projects"
],
"additionalProperties": false
},
"aggregates": {
"type": "object",
"properties": {
"recent_activity": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"id": {
"type": "string"
},
"seen_at": {
"type": "string"
},
"name": {
"type": "string"
},
"title": {
"type": "string"
}
},
"required": [
"type",
"id",
"seen_at"
],
"additionalProperties": false
}
}
},
"additionalProperties": false
},
"prompt_views": {
"type": "object",
"properties": {
"by_project": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"properties": {
"section": {
"type": "string"
},
"body": {
"type": "string"
}
},
"required": [
"section",
"body"
],
"additionalProperties": false
}
},
"user_wide_summary": {
"type": "object",
"properties": {
"section": {
"type": "string"
},
"body": {
"type": "string"
}
},
"required": [
"section",
"body"
],
"additionalProperties": false
}
},
"additionalProperties": false
}
},
"required": [
"context_schema_version",
"generated_at",
"requested_filters",
"data"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢get-project-state(ids)
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.
输入模式
{
"type": "object",
"properties": {
"ids": {
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"description": "The project ids to load sources and creations (project state) for. Only projects you can access are returned."
}
},
"required": [
"ids"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"projects": {
"type": "array",
"items": {
"type": "object",
"properties": {
"project_id": {
"type": "string"
},
"sources": {
"type": "array",
"items": {
"type": "object",
"properties": {
"artifact_id": {
"type": "string"
},
"kind": {
"type": "string",
"const": "source"
},
"type": {
"type": "string"
},
"title": {
"type": "string"
},
"capabilities": {
"type": "array",
"items": {
"type": "string"
}
},
"summary": {
"type": "string"
},
"status": {
"type": "string"
},
"agent_input_type": {
"type": "string"
},
"lineage_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [
"artifact_id",
"kind",
"type",
"title",
"capabilities"
],
"additionalProperties": false
}
},
"creations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"artifact_id": {
"type": "string"
},
"kind": {
"type": "string",
"const": "creation"
},
"type": {
"type": "string"
},
"title": {
"type": "string"
},
"capabilities": {
"type": "array",
"items": {
"type": "string"
}
},
"summary": {
"type": "string"
},
"status": {
"type": "string"
},
"agent_input_type": {
"type": "string"
},
"lineage_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
},
"external_id": {
"description": "Kind-specific downstream id (quizId or mockExamId) for matching a pending request-creation.",
"anyOf": [
{
"type": "string"
},
{
"type": "number"
}
]
}
},
"required": [
"artifact_id",
"kind",
"type",
"title",
"capabilities"
],
"additionalProperties": false
}
}
},
"required": [
"project_id",
"sources",
"creations"
],
"additionalProperties": false
}
}
},
"required": [
"projects"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢get-course-mastery(course_id)
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.
输入模式
{
"type": "object",
"properties": {
"course_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Course id to load practised-topic Infinite Practice mastery for."
}
},
"required": [
"course_id"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"course_id": {
"type": "string",
"minLength": 1,
"description": "Course id whose mastery was loaded, matching followed_courses.course_id."
},
"topic_masteries": {
"type": "array",
"items": {
"type": "object",
"properties": {
"topic_id": {
"type": "string",
"minLength": 1
},
"topic_name": {
"type": "string",
"minLength": 1
},
"mastery": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"questions_answered": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"topic_id",
"mastery",
"questions_answered"
],
"additionalProperties": false
},
"description": "Practised topics only. Empty means this course was loaded and the learner has no IP attempts yet."
}
},
"required": [
"course_id",
"topic_masteries"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟡write-artifact(project_id, artifact)
Create a Studocu artifact from typed content. Provide project_id and an artifact envelope; the artifact type defines the required content shape.
输入模式
{
"type": "object",
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"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)$",
"description": "UUID of the Studocu project that will own the artifact."
},
"artifact": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "creation",
"description": "Artifact kind. Only creation is writable in this MVP."
},
"description": {
"description": "Optional description stored on the creation record.",
"type": "string",
"minLength": 1
},
"title": {
"type": "string",
"minLength": 20,
"maxLength": 255,
"description": "Human-readable quiz title (Core Labs API requires 20-255 characters)."
},
"type": {
"type": "string",
"const": "quiz"
},
"content": {
"type": "object",
"properties": {
"questions": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"question": {
"type": "string",
"minLength": 1,
"description": "Question prompt shown to the learner."
},
"answers": {
"minItems": 2,
"type": "array",
"items": {
"type": "object",
"properties": {
"answer": {
"type": "string",
"minLength": 1,
"description": "Answer option text."
},
"is_correct": {
"type": "boolean",
"description": "True for the correct option or options."
}
},
"required": [
"answer",
"is_correct"
],
"additionalProperties": false
}
},
"explanation": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Required explanation for the correct answer (Core quiz API requires it, max 255 characters)."
},
"difficulty": {
"type": "string",
"enum": [
"EASY",
"MEDIUM",
"HARD"
]
}
},
"required": [
"question",
"answers",
"explanation"
],
"additionalProperties": false
}
},
"course_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"questions"
],
"additionalProperties": false,
"description": "Quiz content."
}
},
"required": [
"kind",
"title",
"type",
"content"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "creation",
"description": "Artifact kind. Only creation is writable in this MVP."
},
"description": {
"description": "Optional description stored on the creation record.",
"type": "string",
"minLength": 1
},
"title": {
"type": "string",
"minLength": 1,
"description": "Human-readable title for the created artifact."
},
"type": {
"type": "string",
"const": "lesson"
},
"content": {
"type": "object",
"properties": {
"lesson_json": {
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"description": {
"type": "string"
},
"outline": {
"type": "object",
"properties": {
"learning_goal": {
"type": "string",
"minLength": 1
},
"title": {
"type": "string",
"minLength": 1
},
"exercises": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"exercise_id": {
"type": "string",
"minLength": 1
},
"topic_id": {
"type": "string",
"minLength": 1
},
"title": {
"type": "string",
"minLength": 1
}
},
"required": [
"exercise_id",
"topic_id",
"title"
],
"additionalProperties": false
}
}
},
"required": [
"learning_goal",
"title",
"exercises"
],
"additionalProperties": false
},
"exercises": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"position": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"title": {
"type": "string",
"minLength": 1
},
"concept_explanation": {
"type": "object",
"properties": {
"paragraph1": {
"type": "string",
"minLength": 1
},
"paragraph2": {
"type": "string",
"minLength": 1
}
},
"required": [
"paragraph1",
"paragraph2"
],
"additionalProperties": false
},
"mcq": {
"type": "array",
"items": {
"type": "object",
"properties": {
"question": {
"type": "string",
"minLength": 1
},
"options": {
"minItems": 2,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"enum": [
"A",
"B",
"C",
"D"
],
"description": "Frontend-supported answer option id."
},
"text": {
"type": "string",
"minLength": 1,
"description": "Option text."
},
"rationale": {
"type": "string",
"minLength": 1,
"description": "Rationale shown for this option."
}
},
"required": [
"id",
"text",
"rationale"
],
"additionalProperties": false
}
},
"correct_option_id": {
"type": "string",
"enum": [
"A",
"B",
"C",
"D"
]
},
"rationale": {
"type": "string",
"minLength": 1
}
},
"required": [
"question",
"options",
"correct_option_id",
"rationale"
],
"additionalProperties": false
}
},
"open_ended": {
"type": "object",
"properties": {
"question": {
"type": "string",
"minLength": 1
},
"expected_points": {
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
"model_answer": {
"type": "string",
"minLength": 1
},
"rubric": {
"type": "string",
"minLength": 1
}
},
"required": [
"question",
"expected_points",
"model_answer",
"rubric"
],
"additionalProperties": false
}
},
"required": [
"id",
"position",
"title",
"concept_explanation",
"mcq",
"open_ended"
],
"additionalProperties": false
}
}
},
"required": [
"title",
"outline",
"exercises"
],
"additionalProperties": false
}
},
"required": [
"lesson_json"
],
"additionalProperties": false,
"description": "Lesson content."
}
},
"required": [
"kind",
"title",
"type",
"content"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "creation",
"description": "Artifact kind. Only creation is writable in this MVP."
},
"description": {
"description": "Optional description stored on the creation record.",
"type": "string",
"minLength": 1
},
"title": {
"type": "string",
"minLength": 1,
"description": "Human-readable title for the created artifact."
},
"type": {
"type": "string",
"const": "mockExam"
},
"content": {
"type": "object",
"properties": {
"exam_json": {
"type": "object",
"properties": {
"schema_version": {
"type": "string",
"const": "0.8"
},
"title": {
"type": "string",
"minLength": 1
},
"front_matter": {
"type": "object",
"properties": {
"instructions_markdown": {
"type": "string"
}
},
"additionalProperties": false
},
"content": {
"minItems": 1,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "section"
},
"id": {
"type": "string",
"minLength": 1
},
"title": {
"type": "string",
"minLength": 1
},
"question_type": {
"type": "string",
"enum": [
"mcq",
"multi_select",
"true_false",
"fill_in_blank",
"text_answer_short",
"text_answer_long"
],
"description": "Frontend-supported KnowledgeTest question type. Use mcq, not multiple_choice."
},
"instructions": {
"type": "string",
"minLength": 1
}
},
"required": [
"kind",
"id",
"question_type"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "stimulus"
},
"id": {
"type": "string",
"minLength": 1
},
"title": {
"type": "string",
"minLength": 1
},
"stimulus_markdown": {
"type": "string",
"minLength": 1
}
},
"required": [
"kind",
"id",
"stimulus_markdown"
],
"additionalProperties": false
},
{
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "question"
},
"id": {
"type": "string",
"minLength": 1
},
"section_id": {
"type": "string",
"minLength": 1
},
"type": {
"type": "string",
"enum": [
"mcq",
"multi_select",
"true_false"
]
},
"marks": {
"type": "number",
"minimum": 0
},
"question_markdown": {
"type": "string",
"minLength": 1
},
"stimulus_id_refs": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
{
"type": "null"
}
]
},
"options": {
"minItems": 2,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"description": "Stable option id."
},
"text": {
"type": "string",
"minLength": 1,
"description": "Option text."
}
},
"required": [
"id",
"text"
],
"additionalProperties": false
}
},
"grading": {
"type": "object",
"properties": {
"correct_answer_ids": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
"correct_answer": {
"type": "string"
},
"model_answer": {
"type": "string",
"minLength": 1
},
"key_points": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"model_answer"
],
"additionalProperties": false
},
"topics": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"id",
"section_id",
"type",
"marks",
"question_markdown",
"options"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "question"
},
"id": {
"type": "string",
"minLength": 1
},
"section_id": {
"type": "string",
"minLength": 1
},
"type": {
"type": "string",
"const": "fill_in_blank"
},
"marks": {
"type": "number",
"minimum": 0
},
"question_markdown": {
"type": "string",
"minLength": 1
},
"stimulus_id_refs": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
{
"type": "null"
}
]
},
"template_markdown": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"blanks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"label": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
}
},
"grading": {
"type": "object",
"properties": {
"correct_answer_ids": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
"correct_answer": {
"type": "string"
},
"model_answer": {
"type": "string",
"minLength": 1
},
"key_points": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"model_answer"
],
"additionalProperties": false
},
"topics": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"id",
"section_id",
"type",
"marks",
"question_markdown"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "question"
},
"id": {
"type": "string",
"minLength": 1
},
"section_id": {
"type": "string",
"minLength": 1
},
"type": {
"type": "string",
"enum": [
"text_answer_short",
"text_answer_long"
]
},
"marks": {
"type": "number",
"minimum": 0
},
"question_markdown": {
"type": "string",
"minLength": 1
},
"stimulus_id_refs": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
{
"type": "null"
}
]
},
"grading": {
"type": "object",
"properties": {
"correct_answer_ids": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
"correct_answer": {
"type": "string"
},
"model_answer": {
"type": "string",
"minLength": 1
},
"key_points": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"model_answer"
],
"additionalProperties": false
},
"topics": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"id",
"section_id",
"type",
"marks",
"question_markdown"
],
"additionalProperties": false
}
]
}
]
}
}
},
"required": [
"schema_version",
"title",
"content"
],
"additionalProperties": false
}
},
"required": [
"exam_json"
],
"additionalProperties": false,
"description": "Mock exam content."
}
},
"required": [
"kind",
"title",
"type",
"content"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "creation",
"description": "Artifact kind. Only creation is writable in this MVP."
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Human-readable note title (Alpha creation store max 255 characters)."
},
"type": {
"type": "string",
"const": "note"
},
"content": {
"type": "object",
"properties": {
"html": {
"type": "string",
"minLength": 1,
"description": "Complete HTML document for the note body (max 1 MiB UTF-8)."
}
},
"required": [
"html"
],
"additionalProperties": false,
"description": "Note content."
}
},
"required": [
"kind",
"title",
"type",
"content"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "creation",
"description": "Artifact kind. Only creation is writable in this MVP."
},
"description": {
"description": "Optional description stored on the creation record.",
"type": "string",
"minLength": 1
},
"title": {
"type": "string",
"minLength": 1,
"description": "Human-readable title for the created artifact."
},
"type": {
"type": "string",
"const": "flashcard"
},
"content": {
"type": "object",
"properties": {
"flashcards_json": {
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"description": {
"type": "string"
},
"flashcards": {
"minItems": 1,
"maxItems": 200,
"type": "array",
"items": {
"type": "object",
"properties": {
"front": {
"type": "string",
"minLength": 1
},
"back": {
"type": "string",
"minLength": 1
}
},
"required": [
"front",
"back"
],
"additionalProperties": false
}
}
},
"required": [
"title",
"description",
"flashcards"
],
"additionalProperties": false
}
},
"required": [
"flashcards_json"
],
"additionalProperties": false,
"description": "Flashcard set content."
}
},
"required": [
"kind",
"title",
"type",
"content"
],
"additionalProperties": false
}
],
"description": "The artifact to create. Pick type; each type defines its own content shape."
}
},
"required": [
"project_id",
"artifact"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"artifactId": {
"type": "string",
"description": "Canonical Studocu artifact URI for the created creation."
},
"kind": {
"type": "string",
"const": "creation",
"description": "Artifact kind returned by the write operation."
},
"projectId": {
"type": "string",
"description": "UUID of the Studocu project that owns the created artifact."
},
"type": {
"type": "string",
"enum": [
"quiz",
"mockExam",
"lesson",
"note",
"flashcard"
],
"description": "Creation type that was written."
},
"title": {
"type": "string",
"description": "Human-readable title of the created artifact."
},
"status": {
"type": "string",
"const": "created",
"description": "Stable write status for successful creation writes."
}
},
"required": [
"artifactId",
"kind",
"projectId",
"type",
"title",
"status"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟡add-document-sources(project_id, document_ids)
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.
输入模式
{
"type": "object",
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"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)$",
"description": "UUID of the Studocu project that will receive the document sources."
},
"document_ids": {
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"description": "One to ten unique Studocu document IDs returned by search-documents."
}
},
"required": [
"project_id",
"document_ids"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"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)$"
},
"sources": {
"type": "array",
"items": {
"type": "object",
"properties": {
"source_id": {
"type": "string",
"format": "uuid",
"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)$"
},
"document_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"title": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"const": "completed"
}
},
"required": [
"source_id",
"document_id",
"title",
"status"
],
"additionalProperties": false
}
}
},
"required": [
"project_id",
"sources"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟡create-project(title, emoji, course_id)
Create a Studocu project and optionally configure its emoji and course. A numeric course_id is validated before project creation.
输入模式
{
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"pattern": "\\S"
},
"emoji": {
"type": "string",
"minLength": 1
},
"course_id": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}输出模式
{
"type": "object",
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"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)$",
"description": "NOTE: These shared primitives are copied from the AI API spec and owned\nlocally by Agent OS to keep this contract decoupled."
},
"title": {
"type": "string",
"minLength": 1,
"description": "Agent-displayable project title. Null Alpha names become \"Untitled project\"."
},
"is_mobile": {
"type": "boolean"
},
"emoji": {
"type": "string",
"minLength": 1
},
"course_id": {
"anyOf": [
{
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"institution_id": {
"anyOf": [
{
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
}
},
"required": [
"project_id",
"title",
"is_mobile",
"emoji",
"course_id",
"institution_id"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🔴update-project(project_id, title, emoji, course_id)
Update a Studocu project title, emoji, or course. Use course_id null to clear the course and institution.
输入模式
{
"type": "object",
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"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)$",
"description": "NOTE: These shared primitives are copied from the AI API spec and owned\nlocally by Agent OS to keep this contract decoupled."
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"pattern": "\\S"
},
"emoji": {
"type": "string",
"minLength": 1
},
"course_id": {
"anyOf": [
{
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
}
},
"required": [
"project_id"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"minProperties": 2,
"anyOf": [
{
"required": [
"title"
]
},
{
"required": [
"emoji"
]
},
{
"required": [
"course_id"
]
}
]
}输出模式
{
"type": "object",
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"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)$",
"description": "NOTE: These shared primitives are copied from the AI API spec and owned\nlocally by Agent OS to keep this contract decoupled."
},
"title": {
"type": "string",
"minLength": 1,
"description": "Agent-displayable project title. Null Alpha names become \"Untitled project\"."
},
"is_mobile": {
"type": "boolean"
},
"emoji": {
"type": "string",
"minLength": 1
},
"course_id": {
"anyOf": [
{
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"institution_id": {
"anyOf": [
{
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
}
},
"required": [
"project_id",
"title",
"is_mobile",
"emoji",
"course_id",
"institution_id"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢request-creation(project_id, type, artifact_ids, instruction, idempotency_key)
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.
输入模式
{
"type": "object",
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"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)$",
"description": "UUID of the Studocu project that will own the new creation."
},
"type": {
"type": "string",
"enum": [
"quiz",
"mockExam"
],
"description": "The kind of creation to generate: quiz or mockExam."
},
"artifact_ids": {
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"description": "One to ten unique source artifact IDs (studocu://project/{project_id}/source/{uuid}) to generate from."
},
"instruction": {
"description": "Optional free-text hint for the generating agent (e.g. \"focus on chapter 3\").",
"type": "string",
"minLength": 1,
"maxLength": 6000
},
"idempotency_key": {
"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.",
"type": "string",
"minLength": 1,
"maxLength": 256
}
},
"required": [
"project_id",
"type",
"artifact_ids"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"artifact_id": {
"description": "Agent OS artifact ID of the new creation. Present when status is created.",
"type": "string",
"minLength": 1
},
"type": {
"type": "string",
"enum": [
"quiz",
"mockExam"
]
},
"status": {
"type": "string",
"enum": [
"created",
"creating",
"outcome_unknown"
],
"description": "created: persisted and linked (artifact_id and external_id). creating: generation finished but Alpha identity is not yet visible (external_id matches get-project-state creation rows). outcome_unknown: client timeout or an in-flight duplicate (check get-project-state; do not mint a new key). Terminal failures use MCP isError, not a status value."
},
"external_id": {
"description": "Kind-specific downstream id (quizId or mockExamId). Present on created and creating; match the same field on get-project-state creation rows. Omitted on timeout.",
"anyOf": [
{
"type": "string"
},
{
"type": "number"
}
]
}
},
"required": [
"type",
"status"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢read-memory(scope, project_id, kind)
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.
输入模式
{
"type": "object",
"properties": {
"scope": {
"description": "Memory scope to read: global, project, or both. Defaults to global unless project_id is set.",
"type": "string",
"enum": [
"global",
"project",
"both"
]
},
"project_id": {
"description": "Project UUID for project-scoped memory; null or omitted reads global (user-level) memory. Required when scope is project or both.",
"anyOf": [
{
"type": "string",
"format": "uuid",
"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)$"
},
{
"type": "null"
}
]
},
"kind": {
"description": "Narrow the result to a single memory kind.",
"type": "string",
"minLength": 1
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"memories": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"description": "Memory kind for this document."
},
"projectId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Owning project UUID, or null for global memory."
},
"value": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "Freeform memory document."
},
"updatedAt": {
"type": "string",
"description": "Last time this memory document changed."
}
},
"required": [
"kind",
"projectId",
"value",
"updatedAt"
],
"additionalProperties": false
},
"description": "Durable memory documents for the authenticated user."
}
},
"required": [
"memories"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🔴write-memory(project_id, kind, value)
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.
输入模式
{
"type": "object",
"properties": {
"project_id": {
"description": "Project UUID for project-local memory; null or omitted stores global (user-level) memory.",
"anyOf": [
{
"type": "string",
"format": "uuid",
"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)$"
},
{
"type": "null"
}
]
},
"kind": {
"type": "string",
"minLength": 1,
"description": "Memory kind, e.g. study_preference or project_learning_context."
},
"value": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "Freeform memory document. MVP convention is { content: string }."
}
},
"required": [
"kind",
"value"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"userId": {
"type": "string",
"description": "Owner of the memory document."
},
"projectId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Owning project UUID, or null for global memory."
},
"kind": {
"type": "string",
"description": "Memory kind that was written."
},
"value": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "Stored memory document."
},
"createdAt": {
"type": "string",
"description": "Creation timestamp of the row."
},
"updatedAt": {
"type": "string",
"description": "Last write timestamp of the row."
}
},
"required": [
"userId",
"projectId",
"kind",
"value",
"createdAt",
"updatedAt"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🔴delete-memory(project_id, kind)
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.
输入模式
{
"type": "object",
"properties": {
"project_id": {
"description": "Project UUID for project-local memory; null or omitted deletes global (user-level) memory.",
"anyOf": [
{
"type": "string",
"format": "uuid",
"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)$"
},
{
"type": "null"
}
]
},
"kind": {
"type": "string",
"minLength": 1,
"description": "Memory kind to delete, e.g. study_preference or project_learning_context."
}
},
"required": [
"kind"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"userId": {
"type": "string",
"description": "Owner of the deleted memory document."
},
"projectId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Owning project UUID, or null for global memory."
},
"kind": {
"type": "string",
"description": "Memory kind that was deleted."
},
"deleted": {
"type": "boolean",
"const": true,
"description": "Always true when the delete succeeds."
}
},
"required": [
"userId",
"projectId",
"kind",
"deleted"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}社区
证据