Skip to main content
Glama

Examplary MCP Server

A Model Context Protocol (MCP) server for Examplary, providing AI assistants with access to the Examplary exam management API.

Features

  • 60+ API Endpoints - Full access to Examplary's exam management capabilities

  • Auto-generated Tools - All API operations automatically available as MCP tools via OpenAPI specification

  • Secure Authentication - User-specific API key authentication

  • Cross-platform - Works on macOS, Linux, and Windows via UV runtime

  • One-click Installation - Install as a .mcpb package in Claude Desktop

Related MCP server: MCPaeroedu

What is Examplary?

Examplary is an AI-powered exam management platform that helps educators:

  • Create and manage exams with AI assistance

  • Generate questions from source materials

  • Grade student responses automatically

  • Organize content in collaborative workspaces

  • Share resources via publisher libraries

Installation

Option 1: Claude Desktop (.mcpb package)

  1. Download the latest examplary-mcp.mcpb from the releases page

  2. Open Claude Desktop

  3. Go to Settings → Extensions

  4. Click "Install Extension" and select the downloaded .mcpb file

  5. When prompted, enter your Examplary API key

Option 2: Manual Installation

  1. Clone this repository:

    git clone https://github.com/examplary-ai/mcp.git
    cd mcp
  2. Install UV (if not already installed):

    curl -LsSf https://astral.sh/uv/install.sh | sh
  3. Run the server:

    export EXAMPLARY_API_KEY="your-api-key-here"
    uv run src/server.py

Getting Your API Key

  1. Log in to Examplary

  2. Navigate to Account → Developer

  3. Click "Generate New API Key"

  4. Copy the API key and save it securely

Note: Keep your API key secret. Never commit it to version control or share it publicly.

Usage

Once installed in Claude Desktop, you can ask Claude to interact with Examplary:

  • "Create a new exam about Python programming"

  • "List all my exams"

  • "Generate questions from this document"

  • "Get the results for exam ID 12345"

  • "Create a new organization workspace"

The MCP server provides access to all Examplary API endpoints, including:

Exam Management

  • Create, read, update, and delete exams

  • Duplicate exams

  • Export to PDF or Word

  • AI-powered question generation

Question Bank

  • Store and organize reusable questions

  • Public and private question types

  • Bulk import from various formats

Student Sessions

  • Create grading sessions

  • Scan documents for answers

  • AI-powered grading and feedback

  • Accept or reject grading suggestions

Organizations & Collaboration

  • Manage workspaces

  • Invite team members

  • Organize exams in folders

Publisher Library

  • Browse public content

  • Share exam templates

  • Discover featured resources

Development

Project Structure

examplary-mcp/
├── manifest.json       # MCPB manifest configuration
├── pyproject.toml      # Python dependencies
├── src/
│   ├── __init__.py
│   └── server.py       # Main MCP server
├── .mcpbignore        # Files excluded from .mcpb package
└── .github/
    └── workflows/
        └── release.yml # Automated release workflow

Local Development

  1. Install dependencies:

    uv pip install -e .
  2. Set your API key:

    export EXAMPLARY_API_KEY="your-api-key"
  3. Run the server:

    uv run src/server.py

Building the .mcpb Package

To build the .mcpb package manually:

zip -r examplary-mcp.mcpb \
  manifest.json \
  pyproject.toml \
  src/ \
  icon.png \
  -x "*.pyc" -x "__pycache__/*" -x ".git/*"

Testing

The server uses stdio transport for communication with Claude Desktop. To test locally:

  1. Run the server with your API key set

  2. The server will start and listen for MCP protocol messages on stdin

  3. Send MCP requests via stdin and receive responses on stdout

API Rate Limits

Examplary enforces rate limits on certain operations:

  • Exam generation: 3 requests per 60 seconds

  • Question operations: 10 requests per 60 seconds

  • Other endpoints: Standard rate limiting applies

Security

  • API keys are stored securely by Claude Desktop

  • All communication uses HTTPS

  • API keys can be revoked at any time from the Examplary dashboard

  • Never share your API key or commit it to version control

Support

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository

  2. Create your feature branch (git checkout -b feature/amazing-feature)

  3. Commit your changes (git commit -m 'Add some amazing feature')

  4. Push to the branch (git push origin feature/amazing-feature)

  5. Open a Pull Request

Credits

Built with:

Available Tools

115 tools
attributes_createC

Create a new custom attribute in the current workspace.

Inputs: name, attributeType, options, showInStudentDashboard, +3 more.

attributes_deleteA

Delete a custom attribute from the current workspace. Default attributes cannot be deleted.

Inputs: id (required).

attributes_listA

Get all custom attributes configured for the current workspace.

Inputs: no named parameters.

attributes_reorderC

Update the position of multiple attributes at once.

Inputs: order.

attributes_updateC

Update an existing attribute in the current workspace.

Inputs: id (required), name, attributeType, options, +4 more.

deleteRubricsidC

Delete a rubric from the current workspace.

Inputs: id (required).

embedSessions_createD

Create a new embed session. This allows you to embed the exam generation flow into your own application.

Inputs: body. Returns: id, status, embedUrl, flow, +9 more

embedSessions_getB

Retrieve an embed session by its ID.

Inputs: id (required). Returns: id, status, embedUrl, flow, +9 more

embedSessions_revokeB

Revoke access to an embed session by its ID.

Inputs: id (required).

exams_cancelGenerationC

Cancel an ongoing job to generate new questions for the exam using AI.

Inputs: id (required).

exams_createC

Create a new exam within your workspace.

Inputs: name, sourceMaterialIds, context, studentLevel, +8 more.

exams_deleteC

Delete the exam.

Inputs: id (required).

exams_duplicateC

Duplicate the exam's questions and settings to a new exam.

Inputs: id (required), name, includeSessions.

exams_export_qti21ZipB

Export an exam as a QTI 2.1 ZIP package.

Inputs: id (required). Returns: url

exams_export_qti3ZipB

Export an exam as a QTI 3 ZIP package.

Inputs: id (required). Returns: url

exams_getA

Get a single exam by its ID.

Inputs: id (required).

exams_getContextSuggestionsA

Get AI-generated suggestions for context/instructions to include in the exam generation prompt, based on the source materials linked to the exam.

Inputs: id (required).

exams_importC

Create an exam by importing one or more source materials (e.g. an existing exam).

Inputs: name, sourceMaterialIds.

exams_listB

Get a list of all exams within your workspace.

Inputs: folder, role.

exams_printB

Export an exam to a PDF file or Word document.

Inputs: id (required).

exams_questions_generateC

Generate a new question for the exam using an AI prompt.

Inputs: id (required), message, questionType.

exams_questions_getD

Retrieve a question by its ID.

Inputs: id (required), questionId (required), format.

exams_questions_importB

Import questions into an exam from a file. Support Word, PDF, Moodle quiz XML and plain text files.

Inputs: id (required), name, type, url, +2 more.

exams_questions_regenerateC

Update a question using an AI prompt.

Inputs: id (required), questionId (required), message.

exams_sessions_acceptAllSuggestionsC

Accept all AI-generated grading suggestions for the exam session.

Inputs: id (required), sessionId (required).

exams_sessions_acceptSuggestionC

Accept a single AI-generated grading suggestion for the exam session.

Inputs: id (required), sessionId (required), questionId (required).

exams_sessions_deleteC

Remove an exam session.

Inputs: id (required), sessionId (required).

exams_sessions_editAnswerC

Edit a single answer in an exam session.

Inputs: id (required), sessionId (required), questionId (required), answer, +1 more.

exams_sessions_generateOverallFeedbackC

Generate feedback for the test as a whole in an exam session.

Inputs: id (required), sessionId (required).

exams_sessions_getC

Get a single exam session by its ID, representing a set of answers from a student.

Inputs: id (required), sessionId (required).

exams_sessions_importC

Manually create a session, possibly from uploaded data.

Inputs: id (required), studentName, source, answers.

exams_sessions_listA

Get a list of all student sessions for an exam, representing a set of answers from a student.

Inputs: id (required).

exams_sessions_saveFeedbackB

Set teacher feedback and/or a grade for a specific question in an exam session.

Inputs: id (required), sessionId (required), question, pointsAwarded, +1 more.

exams_sessions_saveOverallFeedbackC

Set teacher feedback for the test as a whole in an exam session.

Inputs: id (required), sessionId (required), feedback.

exams_sessions_scanC

Scan student answers from a document.

Inputs: id (required).

exams_sessions_scanDocumentC

Start a background task to extract student answers from an uploaded PDF document.

Inputs: id (required), documentUrl.

exams_startGenerationC

Initiate a job to generate new questions for the exam using AI, based on the source materials and metadata specified.

Inputs: id (required).

exams_updateC

Update an existing exam.

Inputs: id (required).

folders_createC

Create a new folder in the current workspace.

Inputs: name.

folders_deleteA

Delete a folder from the current workspace. If there are any exams in the folder, they will be moved out of the folder.

Inputs: id (required).

folders_listA

Get a list of folders for exam organisation that exist within the current workspace.

Inputs: no named parameters.

folders_updateC

Update an existing folder in the current workspace.

Inputs: id (required), name.

getRubricsB

Get a list of rubrics that exist within the current workspace.

Inputs: no named parameters.

groups_addMemberA

Add a member to a group. Requires group manager/owner role or org admin/owner.

Inputs: id (required), body.

groups_createA

Create a new group. Requires admin or owner org role.

Inputs: name.

groups_deleteA

Delete a group and revoke all associated permissions. Requires group manager/owner role or org admin/owner.

Inputs: id (required).

groups_listA

List all groups in the organization. When restricted group visibility is enabled, only returns groups the user belongs to.

Inputs: no named parameters.

groups_listMembersA

List all members of a group with resolved user info. Respects restricted group visibility.

Inputs: id (required).

groups_removeMemberA

Remove a member from the group. Requires group manager/owner role or org admin/owner. Cannot remove the owner.

Inputs: id (required), userId (required).

groups_updateA

Rename a group. Requires group manager/owner role or org admin/owner.

Inputs: id (required), name.

groups_updateMemberA

Change a member's role in the group. Requires group manager/owner role or org admin/owner.

Inputs: id (required), userId (required), role.

jobs_cancelC

Cancel a background job.

Inputs: id (required).

jobs_getC

Poll the status of a background job.

Inputs: id (required).

media_uploadC

Returns a signed URL for uploading a file, and a public URL for accessing it afterwards.

Inputs: filename, type, contentType. Returns: uploadUrl, publicUrl

me_getB

Get the current user's account details.

Inputs: no named parameters.

me_updateC

Update the current user's account details.

Inputs: name, preferences.

org_customDomain_getA

Get custom domain configuration

Inputs: no named parameters.

org_customDomain_updateC

Update custom domain configuration

Inputs: customDomain.

org_deleteB

Delete organization

Inputs: no named parameters.

org_getC

Get organization

Inputs: no named parameters.

orgs_createC

Create a new workspace to collaborate with others on exams.

Inputs: name.

orgs_listB

List all organizations

Inputs: no named parameters.

org_updateC

Update organization

Inputs: name, logoImageUrl, menuColor, accentColor, +2 more.

patchRubricsidC

Update an existing rubric in the current workspace.

Inputs: id (required), name, scoring.

permissions_assignB

Create a new permission for a specific resource, or update the role of an existing actor.

Inputs: resource (required), body. Returns: actor, role, createdAt, updatedAt, +1 more

permissions_autocompleteA

Search for users and groups to share with. Returns matches by name or email. Respects restricted group visibility.

Inputs: q (required), type.

permissions_deleteC

Remove a permission for a specific actor on a specific resource.

Inputs: resource (required), actor (required).

permissions_getActorRoleA

Get the role of a specific actor for a specific resource.

Inputs: actor (required), resource (required). Returns: actor, role, createdAt, updatedAt, +1 more

permissions_listB

Get a list of users, groups and orgs that have access to a specific resource.

Inputs: resource (required). Returns: result

postRubricsC

Add a rubric to the current workspace.

Inputs: name, scoring.

postRubricsGenerateC

Start a background job to generate a rubric using AI.

Inputs: message, sourceMaterialIds, language, context.

practiceSpaces_cancelGenerateTopicsB

Cancel an in-progress mastery topic generation job.

Inputs: id (required).

practiceSpaces_createC

Create a new practice space within your workspace.

Inputs: name, sourceMaterialIds, masteryTopics, settings, +5 more.

practiceSpaces_deleteC

Delete the practice space.

Inputs: id (required).

practiceSpaces_duplicateC

Duplicate the practice space's settings and topics to a new practice space.

Inputs: id (required), name.

practiceSpaces_generateTopicFeedbackC

Get feedback for a specific topic in a practice space.

Inputs: id (required), topicId, feedbackType.

practiceSpaces_generateTopicsC

Start generating mastery topics for a practice space.

Inputs: id (required).

practiceSpaces_getC

Get a single practice space by its ID.

Inputs: id (required).

practiceSpaces_getProgressC

Get the progress of a single practice space by its ID.

Inputs: id (required).

practiceSpaces_listA

Get a list of all practice spaces you have access to in this workspace.

Inputs: folder, role.

practiceSpaces_questionsPreviewC

Get a preview of the top practice space questions by quality score.

Inputs: id (required).

practiceSpaces_sessions_createC

Create a new practice space session.

Inputs: id (required), prompt.

practiceSpaces_sessions_getC

Get a practice space session by its ID.

Inputs: id (required), sessionId (required).

practiceSpaces_sessions_getMineC

Get the current user's past practice space session.

Inputs: id (required).

practiceSpaces_sessions_saveAnswerC

Save an answer for a specific question in a practice space session.

Inputs: id (required), sessionId (required), questionId (required), question, +3 more.

practiceSpaces_students_getC

Get details about a specific practice space student.

Inputs: id (required), studentId (required).

practiceSpaces_students_listC

Get a list of all students that practiced in a practice space.

Inputs: id (required).

practiceSpaces_updateC

Update an existing practice space.

Inputs: id (required), name, settings, folder, +5 more.

questionBank_createC

Add a question to the question bank in the current workspace.

Inputs: question.

questionBank_deleteC

Delete a question bank item from the current workspace.

Inputs: id (required).

questionBank_listA

Get a list of question bank items that exist within the current workspace.

Inputs: no named parameters.

questionBank_updateC

Update an existing question bank item in the current workspace.

Inputs: id (required), question.

questionTypes_deleteA

Deletes a specific question type by its ID. Note that only the owner organization of the question type can delete it, and only if it has not been used in an exam.

Inputs: id (required).

questionTypes_disableB

Disable a question type for the current workspace.

Inputs: id (required).

questionTypes_enableC

Enable a question type for the current workspace.

Inputs: id (required).

questionTypes_getB

Retrieves a specific question type by its ID.

Inputs: id (required).

questionTypes_getQti3PciC

Get JS module for a question type PCI for QTI 3 export.

Inputs: id (required).

questionTypes_listA

Lists all question types, either those available by default or those created within the user's organization.

Inputs: no named parameters.

questionTypes_listPublicA

Lists all public question types, which can be enabled in workspaces.

Inputs: no named parameters.

questionTypes_upsertA

Creates a new question type or updates an existing one. If the question type already exists, it will be updated; otherwise, a new one will be created.

Inputs: $schema, id, name, description, +26 more.

sourceMaterials_createC

Add a source material and start processing it for later use in an exam.

Inputs: url, type, name, size, +3 more. Returns: org, id, type, createdBy, +16 more

sourceMaterials_deleteB

Deletes the specified source material.

Inputs: id (required).

sourceMaterials_getB

Returns the current status and facts extracted from the specified source material.

Inputs: id (required). Returns: org, id, type, createdBy, +16 more

sourceMaterials_listB

Returns a list of source materials for the current organization.

Inputs: externalId. Returns: result

sourceMaterials_sliceA

Create a new source material based on a specific page range of an existing source material.

Inputs: id (required), startPage, endPage, name. Returns: org, id, type, createdBy, +16 more

sourceMaterials_updateC

Updates the specified source material.

Inputs: id (required), name.

studentLevels_listA

Get a list of available default student levels.

Inputs: no named parameters.

taxonomies_createC

Save a new taxonomy in the current workspace.

Inputs: name, description, instructions, levels.

taxonomies_deleteA

Delete a taxonomy from the current workspace. This fails if there are any exams associated with the taxonomy.

Inputs: id (required).

taxonomies_listA

Get a list available taxonomies, including defaults and taxonomies created in the current workspace.

Inputs: no named parameters.

taxonomies_updateC

Update an existing taxonomy in the current workspace.

Inputs: id (required), name, description, instructions, +1 more.

users_createC

Create a new user in the workspace.

Inputs: email, name, role, sendInvite.

users_deleteC

Delete a user from the workspace.

Inputs: id (required).

users_listA

Get a list of all users in the workspace.

Inputs: no named parameters.

users_updateD

Update a user's role within the workspace.

Inputs: id (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.5/5.0

    Scored across 115 tools

    Disambiguation4/5

    Most tools are grouped by resource (e.g., exams_, groups_), making their purpose clear. However, some tool names like exams_import and sourceMaterials_create could be confused without descriptions, and the mix of singular/plural resource names (e.g., questionBank vs studentLevels) causes minor ambiguity.

    Naming Consistency2/5

    Naming conventions are inconsistent: some use snake_case (attributes_create), some use camelCase for the resource prefix (embedSessions_create), and a few use no separator (deleteRubricsid). This mix of styles makes the set feel unpolished.

    Tool Count2/5

    At 115 tools, the count is very high for an MCP server, likely overwhelming for agents. While the domain (exam management) is broad, many tools could be consolidated (e.g., separate tools for each exam session operation).

    Completeness4/5

    The tool surface covers the full lifecycle of exams, sessions, groups, rubrics, question banks, and more, including AI generation and export. Minor gaps exist (e.g., no bulk delete or analytics), but core workflows are well-supported.

    Maintenance

    ActivityNo data
    ResponsivenessSyncing

    Related MCP Connectors

    Related MCP Servers