UNPKG

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
{ "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" }