mcp-quiz-server
Version:
🧠AI-Powered Quiz Management via Model Context Protocol (MCP) - Create, manage, and take quizzes directly from VS Code, Claude, and other AI agents.
358 lines (357 loc) • 21 kB
JSON
{
"name": "mcp-quiz-server",
"version": "0.0.1",
"description": "🧠AI-Powered Quiz Management via Model Context Protocol (MCP) - Create, manage, and take quizzes directly from VS Code, Claude, and other AI agents.",
"main": "dist/index.js",
"bin": {
"mcp-quiz-server": "dist/index.js",
"mcp-quiz": "dist/index.js"
},
"preferGlobal": true,
"engines": {
"node": ">=16.0.0"
},
"files": [
"dist/",
"public/",
"data/",
"README.md",
"LICENSE",
"package.json"
],
"repository": {
"type": "git",
"url": "git+https://github.com/GSejas/mcp-quiz-oss.git"
},
"bugs": {
"url": "https://github.com/GSejas/mcp-quiz-oss/issues"
},
"homepage": "https://github.com/GSejas/mcp-quiz-oss#readme",
"scripts": {
"dev": "nodemon src/server.ts",
"dev:quick": "npm run build:ts && npm run start",
"dev:full": "concurrently \"npm run dev\" \"npm run watch:css\"",
"build": "npm run build:css && npm run build:ts && npm run build:frontend",
"build:dev": "npm run build:ts && npm run build:frontend",
"build:fast": "npm run build:ts && npm run build:frontend",
"build:css": "npx tailwindcss -i ./public/styles.css -o ./public/output.css --minify",
"build:ts": "tsc",
"build:frontend": "cd public && tsc",
"build:mcp": "tsc src/mcp-server.ts --outDir dist --experimentalDecorators --emitDecoratorMetadata --useDefineForClassFields false --target es2020 --module commonjs",
"watch:css": "npx tailwindcss -i ./public/styles.css -o ./public/output.css --watch",
"watch:ts": "tsc --watch",
"watch:frontend": "cd public && tsc --watch",
"watch:all": "concurrently \"npm run watch:ts\" \"npm run watch:frontend\" \"npm run watch:css\"",
"start": "node dist/server.js",
"start:mcp": "node dist/mcp-server.js",
"setup": "ts-node scripts/setup.ts",
"setup:build": "npm run build:css && npm run build:frontend",
"setup:interactive": "ts-node scripts/setup.ts run",
"setup:silent": "ts-node scripts/setup.ts --silent",
"setup:reset": "ts-node scripts/setup.ts reset",
"setup:status": "ts-node scripts/setup.ts status",
"watch": "concurrently \"npm run dev\" \"npm run build:css -- --watch\"",
"db:init": "ts-node src/database/init.ts init",
"db:reset": "ts-node src/database/init.ts reset",
"db:migrate": "ts-node src/database/init.ts migrate ./quizzes",
"db:test": "ts-node src/database/init.ts test",
"typeorm": "typeorm-ts-node-commonjs",
"test": "npm run build:dev && npm run test:smoke && npm run test:e2e",
"test:quick": "node tests/test-static-files.js && node tests/test-error-handling.js",
"test:smoke": "npm run build:dev && node tests/test-component-smoke.js",
"test:integration": "npm run build:dev && node tests/test-integration.js",
"test:auth-integration": "npm run build:dev && node tests/integration/auth-mcp-integration.test.js",
"demo:sse": "npm run build:dev && node dist/examples/sse-auth-demo.js",
"demo:sse-dev": "ts-node examples/sse-auth-demo.ts",
"sse:minimal": "node scripts/start-sse-minimal.js",
"sse:test": "npm run sse:minimal",
"sse:client": "npx http-server public -p 8080 -o sse-test-client.html",
"dev:sse": "cross-env FEATURE_SSE_TRANSPORT=true npm run dev",
"start:sse": "cross-env FEATURE_SSE_TRANSPORT=true npm start",
"test:e2e": "npm run build:dev && node tests/test-e2e.js",
"test:timer": "node tests/timer-component.test.js",
"test:timer-ux": "jest tests/integration/timer-ux-improvement.test.js --verbose",
"test:timer-e2e": "npx playwright test tests/playwright/timer-ux-e2e.spec.ts",
"test:timer-comprehensive": "node tests/timer-ux-test-runner.js",
"test:ai-explore": "node tests/ai-exploratory/ai-exploration-agent.js",
"test:settings": "node tests/test-settings-user-journey.js",
"test:quiz-modal": "node tests/test-quiz-start-modal.js",
"test:instant-submit": "node tests/test-instant-submission.js",
"test:new-features": "npm run test:quiz-modal && npm run test:instant-submit",
"test:playwright:modal": "npx playwright test tests/playwright/quiz-start-modal.spec.ts",
"test:playwright:instant": "npx playwright test tests/playwright/instant-submission.spec.ts",
"test:playwright:new": "npx playwright test tests/playwright/quiz-start-modal.spec.ts tests/playwright/instant-submission.spec.ts",
"test:playwright": "npx playwright test",
"test:chrome": "npx playwright test --project=chromium",
"test:chrome-headed": "npx playwright test --project=chromium-headed",
"test:playwright:headed": "npx playwright test --project=chromium-headed",
"test:playwright:debug": "npx playwright test --debug",
"test:playwright:ui": "npx playwright test --ui",
"test:playwright:report": "npx playwright show-report",
"test:baseline": "npx playwright test --update-snapshots",
"test:visual": "npx playwright test --grep 'visual regression'",
"test:update-baselines": "npx playwright test --update-snapshots",
"test:clean": "rimraf tests/playwright-artifacts tests/playwright-report tests/playwright-results.json",
"test:playwright:ci": "npx playwright test --reporter=json",
"test:bdd": "node dist/tests/bdd/clean-architecture.bdd.test.js",
"test:bdd:dev": "ts-node tests/bdd/clean-architecture.bdd.test.ts",
"test:comprehensive": "node dist/tests/runners/comprehensive-test-runner.js",
"test:comprehensive:dev": "ts-node tests/runners/comprehensive-test-runner.ts",
"test:clean-arch": "npm run test:comprehensive",
"test:clean-arch:verbose": "npm run test:comprehensive -- --verbose",
"test:health": "npx playwright test tests/playwright/health-endpoint.spec.ts && jest tests/integration/health-endpoint.integration.test.js",
"test:health:e2e": "npx playwright test tests/playwright/health-endpoint.spec.ts",
"test:health:integration": "jest tests/integration/health-endpoint.integration.test.js",
"test:smoke-pw": "npx playwright test --grep '@smoke'",
"test:regression": "npx playwright test --grep '@regression'",
"test:all": "npm run test:quick && npm run test:timer && npm run test && npm run test:settings && npm run test:playwright && npm run test:ai-explore && npm run test:components",
"test:build": "npm run build:ts",
"tag": "node scripts/tag-workflow.js",
"tag:patch": "node scripts/tag-workflow.js --type patch",
"tag:minor": "node scripts/tag-workflow.js --type minor",
"tag:major": "node scripts/tag-workflow.js --type major",
"tag:list": "node scripts/tag-workflow.js --list",
"tag:release": "node scripts/tag-workflow.js --type minor --message 'Timer testing & build optimization release'",
"test:mcp": "node tests/test-complete-workflow.js",
"test:mcp:all": "node tests/test-all-tools.js",
"test:mcp:create": "node tests/test-debug-create.js",
"test:mcp:enhanced": "node tests/mcp/enhanced-mcp.test.js",
"test:mcp:refactored": "node tests/mcp/refactored-handler.test.js",
"test:mcp:resources": "node tests/mcp/resources-e2e.test.js",
"requirements:enhanced": "ts-node scripts/req_tracer/enhanced-requirements-tracer.ts",
"requirements:mermaid": "ts-node scripts/req_tracer/enhanced-requirements-tracer.ts --format=mermaid",
"requirements:report": "npm run requirements:enhanced --output=reports/enhanced-traceability-report.json",
"requirements:dashboard": "ts-node scripts/dashboard-generator.ts --serve --port 3001",
"requirements:export": "ts-node scripts/dashboard-generator.ts --output=reports/dashboard.html",
"requirements:full": "npm run requirements:enhanced && npm run requirements:export",
"req:analyze": "ts-node scripts/req_tracer/bidirectional-mapper.ts",
"req:validate": "ts-node scripts/req_tracer/bidirectional-mapper.ts --validate-only",
"req:gaps": "ts-node scripts/req_tracer/bidirectional-mapper.ts --gaps-only",
"req:impact": "ts-node scripts/req_tracer/bidirectional-mapper.ts --impact-analysis",
"kpi:collect": "npm run build:ts && node dist/scripts/kpi/kpi-collector.js",
"kpi:baseline": "npm run build:ts && node dist/scripts/kpi/kpi-baseline.js",
"kpi:baseline:ci": "npm run build:ts && node dist/scripts/kpi/kpi-baseline.js --ci-mode",
"kpi:baseline:report": "npm run kpi:baseline && echo 'KPI baseline report generated in reports/baseline/'",
"kpi:monitoring": "npm run kpi:collect --mode=monitoring",
"kpi:full": "npm run kpi:baseline && npm run kpi:collect",
"kpi:reset": "rm -rf reports/baseline/* reports/kpi/* && echo 'KPI data reset'",
"req:fix-headers": "ts-node scripts/req_tracer/header-fixer.ts",
"req:update-matrix": "ts-node scripts/req_tracer/matrix-generator.ts",
"req:cleanup": "ts-node scripts/req_tracer/cleanup-tool.ts",
"req:report": "npm run req:analyze --output=scripts/req_tracer/output/bidirectional-analysis-report.md",
"req:dashboard": "ts-node scripts/req_tracer/dashboard-server.ts --port 3002",
"req:export": "ts-node scripts/req_tracer/bidirectional-mapper.ts --export-json",
"req:generate-types": "ts-node scripts/requirements_type_support/run-generator.ts",
"req:types": "npm run req:generate-types",
"req:parse": "ts-node scripts/requirements_type_support/run-generator.ts -- --parse-only",
"transform:headers": "ts-node scripts/header_change/transform-headers.ts",
"transform:headers:dry": "npm run transform:headers -- --dry-run",
"transform:headers:verbose": "npm run transform:headers -- --verbose",
"test:integration:architecture": "node tests/integration/architecture-integration.test.js",
"test:transport:simple": "node tests/transport/transport-simple.test.js",
"test:db": "npm run db:test",
"test:ci": "npm run build && npm run test:build && npm run test:mcp && npm run test:db",
"test:coverage": "jest --coverage",
"test:jest": "jest",
"test:watch": "jest --watch",
"test:coverage:all": "npm run test:coverage:jest && npm run test:coverage:playwright && npm run test:coverage:custom",
"test:coverage:jest": "jest --coverage --coverageDirectory=coverage/jest",
"test:coverage:playwright": "nyc --reporter=lcov --report-dir=coverage/playwright --temp-dir=.nyc_output_playwright npx playwright test --config=playwright-coverage.config.ts --project=chromium-coverage",
"test:coverage:custom": "nyc --reporter=lcov --report-dir=coverage/custom --temp-dir=.nyc_output_custom node tests/test-complete-workflow.js",
"test:mcp:suite": "npm run test:mcp:enhanced && npm run test:mcp:refactored && npm run test:mcp:resources",
"test:integration:suite": "npm run test:integration:architecture",
"test:transport:suite": "npm run test:transport:simple && node tests/transport/transport-layer-integration.test.js",
"test:sse": "npm run build:dev && jest tests/sse-streaming-e2e.test.js",
"test:sse:auth": "npx playwright test tests/e2e/sse-auth-flow.test.ts",
"test:sse:auth:headed": "npx playwright test tests/e2e/sse-auth-flow.test.ts --headed",
"test:sse:auth:debug": "npx playwright test tests/e2e/sse-auth-flow.test.ts --headed --debug",
"test:components": "npm run test:db-components && npm run test:auth-security && npm run test:input-validation && npm run test:performance",
"test:db-components": "node tests/test-database-components.js",
"test:auth-security": "node tests/test-authentication-security.js",
"test:input-validation": "node tests/test-input-validation.js",
"test:performance": "node tests/test-performance-load.js",
"test:security:logging": "jest tests/e2e/security-logging-verification.test.js",
"test:security": "jest --config tests/security/jest.config.js",
"test:security:coverage": "jest --config tests/security/jest.config.js --coverage",
"test:security:watch": "jest --config tests/security/jest.config.js --watch",
"test:security:auth": "jest tests/security/jwt-auth-service.test.ts",
"test:security:commands": "jest tests/security/command-bus.test.ts",
"test:security:memory": "jest tests/security/memory-manager.test.ts",
"test:security:decorators": "jest tests/security/memory-control-decorators.test.ts",
"test:security:transport": "jest tests/security/transport-layer-security.test.ts",
"test:security:all": "npm run test:security:auth && npm run test:security:commands && npm run test:security:memory && npm run test:security:decorators && npm run test:security:transport",
"security:validate": "node scripts/quick-security-validation.js",
"security:validate:full": "ts-node scripts/validate-security-build.ts",
"security:report": "node scripts/comprehensive-security-report.js",
"coverage:merge": "node scripts/merge-coverage.js",
"coverage:report": "npm run test:coverage:all && npm run coverage:merge",
"lint": "npm run lint:ts && npm run lint:format && npm run lint:eslint",
"deploy": "chmod +x scripts/deploy.sh && scripts/deploy.sh",
"deploy:windows": "powershell -ExecutionPolicy Bypass -File deploy-windows.ps1",
"deploy:prod": "npm run build:prod && npm run deploy",
"deploy:proxy": "chmod +x scripts/setup-proxy.sh && scripts/setup-proxy.sh",
"deploy:check": "scripts/monitor.sh --check-all",
"deploy:check-proxy": "chmod +x scripts/check-proxy.sh && scripts/check-proxy.sh",
"test:deployment": "powershell -ExecutionPolicy Bypass -File test-deployment.ps1",
"deploy:ssl": "chmod +x scripts/setup-ssl.sh && scripts/setup-ssl.sh",
"deploy:monitor": "scripts/monitor.sh --daemon",
"deploy:status": "scripts/monitor.sh --status",
"deploy:stop-monitor": "scripts/monitor.sh --stop",
"docker:build": "docker build -t mcp-quiz-server:latest .",
"docker:run": "docker run -d --name mcp-quiz-server -p 3000:3000 mcp-quiz-server:latest",
"docker:stop": "docker stop mcp-quiz-server && docker rm mcp-quiz-server",
"docker:prod": "docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d",
"docker:prod:stop": "docker-compose -f docker-compose.yml -f docker-compose.prod.yml down",
"docker:prod:logs": "docker-compose -f docker-compose.yml -f docker-compose.prod.yml logs -f",
"docker:proxy": "docker-compose -f docker-compose.yml -f docker-compose.proxy.yml up -d",
"docker:proxy:stop": "docker-compose -f docker-compose.yml -f docker-compose.proxy.yml down",
"docker:proxy:logs": "docker-compose -f docker-compose.yml -f docker-compose.proxy.yml logs -f",
"build:prod": "npm run build:css && npm run build:ts && npm run build:frontend",
"lint:ts": "tsc --noEmit && cd public && tsc --noEmit",
"lint:eslint": "eslint . --ext .ts,.js",
"lint:format": "prettier --check \"**/*.{ts,js,json,md}\" --ignore-path .gitignore",
"format": "prettier --write \"**/*.{ts,js,json,md}\" --ignore-path .gitignore",
"format:python": "ruff format .",
"lint:python": "ruff check .",
"precommit:install": "pip install pre-commit && pre-commit install",
"precommit:setup": "node scripts/setup-precommit.js",
"precommit:run": "pre-commit run --all-files",
"precommit:update": "pre-commit autoupdate",
"precommit:quick": "npm run lint:ts && npm run build:frontend && npm run test:quick",
"precommit:offline": "npm run lint:ts && npm run build:frontend && npm run build:css",
"precommit:full": "npm run lint:ts && npm run build && npm run test:smoke && npm run test:component",
"precommit:check": "npm run precommit:quick && echo '✅ Pre-commit checks passed!'",
"precommit:check:offline": "npm run precommit:offline && echo '✅ Offline pre-commit checks passed!'",
"commit:ready": "npm run precommit:full && echo '🚀 Ready to commit!'",
"gcp:install": "powershell -ExecutionPolicy Bypass -File scripts/install-gcp-packages.ps1",
"gcp:setup": "powershell -ExecutionPolicy Bypass -File scripts/setup-google-cloud-logging.ps1",
"gcp:start": "powershell -ExecutionPolicy Bypass -File start-with-gcp-logging.ps1",
"validate": "ts-node scripts/validate-checklist.ts",
"validate:file": "ts-node scripts/validate-checklist.ts --files",
"validate:quick": "npm run validate:file public/js/services/TimerService.ts public/js/components/QuizContent.ts",
"review": "npm run validate && echo '✅ Code review checklist validation complete'",
"clean": "rimraf dist coverage tests/playwright-artifacts tests/playwright-report node_modules/.cache",
"clean:full": "npm run clean && rimraf node_modules package-lock.json && npm install",
"dev:reset": "npm run clean && npm run build && npm run db:reset && npm run start",
"debug": "node --inspect-brk dist/server.js",
"debug:mcp": "node --inspect-brk dist/mcp-server.js",
"health": "curl -f http://localhost:3000/health || node -e \"console.log('Server not running on port 3000')\"",
"mcp:test-tools": "echo '{\"jsonrpc\":\"2.0\",\"method\":\"tools/list\",\"id\":1}' | node dist/mcp-server.js",
"security:audit": "npm audit && npm run lint:security",
"lint:security": "eslint . --ext .ts,.js --config .eslintrc.security.js || echo 'Security linting completed'",
"performance:profile": "node --prof dist/server.js && node --prof-process isolate-*.log > profile.txt",
"openapi:generate": "ts-node scripts/generate-openapi.ts",
"openapi:serve": "npm run dev & echo 'OpenAPI docs available at http://localhost:3000/api-docs'",
"docs:openapi": "npm run openapi:generate && echo 'OpenAPI spec generated for Mintlify'",
"docs:md-to-mdx": "npx remark --use remark-mdx --use remark-frontmatter --output --ext mdx",
"docs:convert-dir": "npx remark docs/ --use remark-mdx --use remark-frontmatter --output --ext mdx",
"docs:convert-single": "npx remark --use remark-mdx --use remark-frontmatter --output --ext mdx",
"docs:fix-mdx": "node scripts/fix-mdx-files.js",
"docs:fix-mdx-docs": "node scripts/fix-mdx-files.js \"./docs/**/*.{md,mdx}\"",
"docs:fix-mdx-ps": "powershell -ExecutionPolicy Bypass -File scripts/fix-mdx-files.ps1",
"prepublishOnly": "npm run build && npm run test:ci",
"prepack": "npm run build",
"postpack": "echo '📦 Package created successfully!'",
"publish:dry": "npm publish --dry-run",
"publish:test": "npm run build && npm run publish:dry",
"release:patch": "npm version patch && git push && git push --tags",
"release:minor": "npm version minor && git push && git push --tags",
"release:major": "npm version major && git push && git push --tags"
},
"dependencies": {
"@types/cookie-parser": "^1.4.9",
"@types/cors": "^2.8.19",
"@types/helmet": "^0.0.48",
"@types/morgan": "^1.9.10",
"@types/winston": "^2.4.4",
"body-parser": "^1.19.0",
"cookie-parser": "^1.4.7",
"cors": "^2.8.5",
"express": "^4.17.1",
"express-rate-limit": "^8.0.1",
"express-slow-down": "^2.1.0",
"express-validator": "^7.2.1",
"helmet": "^8.1.0",
"jsonwebtoken": "^9.0.2",
"morgan": "^1.10.1",
"reflect-metadata": "^0.1.13",
"sqlite3": "^5.1.6",
"typeorm": "^0.3.17",
"uuid": "^9.0.1",
"winston": "^3.17.0"
},
"optionalDependencies": {
"@google-cloud/logging": "^11.0.0",
"@google-cloud/logging-winston": "^6.0.0"
},
"devDependencies": {
"@babel/core": "^7.28.0",
"@babel/preset-env": "^7.28.0",
"@playwright/test": "^1.40.0",
"@types/body-parser": "^1.19.6",
"@types/commander": "^2.12.0",
"@types/express": "^4.17.23",
"@types/jest": "^30.0.0",
"@types/jsonwebtoken": "^9.0.10",
"@types/node": "^20.8.0",
"@types/supertest": "^6.0.3",
"@types/swagger-jsdoc": "^6.0.4",
"@types/swagger-ui-express": "^4.1.8",
"@types/uuid": "^10.0.0",
"@typescript-eslint/eslint-plugin": "^6.21.0",
"@typescript-eslint/parser": "^6.21.0",
"babel-jest": "^30.0.5",
"concurrently": "^8.2.2",
"cross-env": "^10.0.0",
"eslint": "^8.57.1",
"eslint-plugin-security": "^1.7.1",
"eventsource": "^4.0.0",
"glob": "^11.0.3",
"jest": "^29.7.0",
"jsdom": "^24.1.3",
"lcov-result-merger": "^4.1.0",
"mintlify": "^4.2.45",
"node-fetch": "^3.3.2",
"nodemon": "^3.0.1",
"nyc": "^15.1.0",
"prettier": "^3.6.2",
"remark": "^15.0.1",
"remark-frontmatter": "^5.0.0",
"remark-gfm": "^4.0.1",
"remark-mdx": "^3.1.0",
"remark-stringify": "^11.0.0",
"rimraf": "^5.0.5",
"supertest": "^7.1.4",
"swagger-jsdoc": "^6.2.8",
"swagger-ui-express": "^5.0.1",
"tailwindcss": "^3.4.0",
"ts-jest": "^29.4.0",
"ts-node": "^10.9.1",
"ts-unused-exports": "^11.0.1",
"typescript": "^5.2.2"
},
"keywords": [
"mcp",
"model-context-protocol",
"ai-agent",
"vscode",
"claude",
"quiz",
"education",
"learning",
"npx",
"zero-install",
"stdio",
"json-rpc",
"typescript",
"nodejs",
"sqlite",
"express",
"open-source",
"developer-tools",
"ai-integration",
"educational-technology"
],
"author": "GSejas",
"license": "MIT"
}