Oa Y Mcp Service — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Oa Y Mcp Service (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
MCP for managing courses via HTTP API at oa-y.com.
This service supports two transport protocols for MCP integration: STDIO and StreamableHTTP.
For local integration with Cursor, Claude Desktop, or other MCP clients:
{
"mcpServers": {
"oa-y-mcp-service": {
"command": "npx",
"args": ["-y", "github:AdminRHS/oa-y-mcp-service"],
"env": {
"APP_ENV": "prod",
"API_TOKEN": "your_token",
"API_TOKEN_LIBS": "your_libs_token"
}
}
}
}For remote integration via StreamableHTTP:
{
"mcpServers": {
"oa-y-remote": {
"url": "http://your-server:3000/mcp?API_TOKEN=your_token&API_TOKEN_LIBS=your_libs_token&APP_ENV=prod"
}
}
}When to use each transport:
How to get your API_TOKEN:
API_TOKEN environment variable.How to get your API_TOKEN_LIBS:
API_TOKEN_LIBS environment variable.Environment setting:
prod - Production environment (default, uses oa-y.com and libs.anyemp.com)dev - Development/testing (uses lrn.oa-y.com and libdev.anyemp.com)This section describes all available tools for managing courses, lessons, modules, tests, and professions.
get_courses — get a list of courses (with filters and pagination, supports profession filtering)get_course — get a course by idcreate_course — create a course (requires module IDs from create_module)update_course — update a course (requires module IDs from create_module)get_lessons — get a list of lessonsget_lesson — get a lesson by idcreate_lesson — create a lesson (use this first to get lesson IDs)update_lesson — update a lessonget_modules — get a list of modulesget_module — get a module by idcreate_module — create a module (requires lesson IDs from create_lesson)update_module — update a module (requires lesson IDs from create_lesson)get_tests — get a list of testsget_test — get a test by idcreate_test — create a test (requires lesson ID from create_lesson, tests are attached to lessons)update_test — update a test (requires lesson ID from create_lesson, tests are attached to lessons)get_professions — get all professions (returns array with name and ID)get_skills — get all skills (returns array with name and ID)get_tools — get all tools (returns array with name and ID)IMPORTANT: Follow the correct sequential creation order for courses, modules, lessons, and tests.
Sequential workflow:
create_course to create the course structurecreate_module to create a modulecreate_lesson to create a lessoncreate_test with the lesson ID to attach test to this lessonupdate_lesson to add test IDs to the lesson's tests arrayupdate_module to add all created lesson IDs to the modulelessons: ["lesson_id_1", "lesson_id_2", "lesson_id_3"]update_course to add all module IDs with their ordermodules: [{ module: "module_id_1", order: 1 }, { module: "module_id_2", order: 2 }]Required structure:
Data flow:
Course
└─ Module 1 (order: 1)
├─ Lesson 1
│ └─ Test 1 (optional)
├─ Lesson 2
│ └─ Test 2 (optional)
└─ ...
└─ Module 2 (order: 2)
├─ Lesson 1
└─ ...Get Courses:
{
"name": "get_courses",
"arguments": { "page": 1, "limit": 10 }
}Get Courses by Professions:
{
"name": "get_courses",
"arguments": {
"professions": [68, 69],
"difficulty": "beginner"
}
}Create Lesson (first):
{
"name": "create_lesson",
"arguments": {
"title": "Lesson Title",
"description": "Lesson description (optional)",
"type": "text",
"contentType": "standard",
"content": "Lesson content here",
"image": "https://example.com/lesson-image.jpg",
"duration": 30,
"professions": [],
"skills": [],
"tests": []
}
}Create Module (with lesson IDs):
{
"name": "create_module",
"arguments": {
"title": "Module Title",
"content": "Module description (plain text)",
"description": "Optional detailed description",
"videoUrl": "https://example.com/video.mp4",
"previewImage": "https://example.com/preview.jpg",
"lessons": ["lesson_id_from_create_lesson"]
}
}Note: Modules don't contain tests directly. Tests are attached to lessons.
Create Course (with module IDs):
{
"name": "create_course",
"arguments": {
"title": "Course Title",
"description": "Course description",
"difficulty": "beginner",
"modules": [
{
"module": "module_id_from_create_module",
"order": 1
}
],
"professions": [],
"image": "",
"duration": 60
}
}Get Professions:
{
"name": "get_professions",
"arguments": {}
}Get Skills:
{
"name": "get_skills",
"arguments": {}
}Get Tools:
{
"name": "get_tools",
"arguments": {}
}Create Test (with lesson ID):
{
"name": "create_test",
"arguments": {
"title": "Test Title",
"description": "Test description",
"lesson": "lesson_id_from_create_lesson",
"questions": [
{
"question": "What is HTML?",
"type": "single-choice",
"options": [
{ "text": "HyperText Markup Language", "isCorrect": true },
{ "text": "High Tech Modern Language", "isCorrect": false }
],
"points": 10
}
],
"passingScore": 70,
"timeLimit": 30
}
}IMPORTANT: Tests are attached to lessons, not modules. Use lesson ID from create_lesson.
Update Course (with module IDs):
{
"name": "update_course",
"arguments": {
"courseId": "course_id_here",
"title": "Updated Course Title",
"description": "Updated course description",
"difficulty": "intermediate",
"modules": [
{
"module": "existing_module_id",
"order": 1
},
{
"module": "new_module_id_from_create_module",
"order": 2
}
]
}
}The get_courses tool supports filtering courses by profession IDs:
Workflow:
get_professions to get all available professions with their IDsget_courses with the professions parameterParameters:
professions - Array of profession IDs (numbers)difficulty - Filter by difficulty: "beginner", "intermediate", "advanced"search - Search by course name or descriptionpage - Page number for paginationlimit - Number of courses per pageall - Get all courses without paginationThis section describes how to test the MCP service in different modes.
Prerequisites:
Steps:
npm install npm run buildThis creates oa-y-mcp-service.cjs file that will be used by MCP clients.
Add to your MCP settings file:
{
"mcpServers": {
"oa-y-local": {
"command": "node",
"args": ["c:/Projects/RH/oa-y-mcp-service/oa-y-mcp-service.cjs"],
"env": {
"APP_ENV": "prod",
"API_TOKEN": "your_token",
"API_TOKEN_LIBS": "your_libs_token"
}
}
}
}get_professions to verify connectioncreate_lessonFor development/debugging:
npm run dev # Run in STDIO mode
npm run dev:inspect # Run with Node InspectorPrerequisites:
Steps:
npm install npm start
# or
npm run http curl http://localhost:3000/healthAdd to your MCP settings file:
{
"mcpServers": {
"oa-y-http": {
"url": "http://localhost:3000/mcp?API_TOKEN=your_token&API_TOKEN_LIBS=your_libs_token&APP_ENV=prod"
}
}
}get_professions to verify connectioncreate_lessonFor development/debugging:
npm run http:inspect # Run HTTP server with Node InspectorAvailable HTTP endpoints:
GET /mcp — StreamableHTTP handshake/streamPOST /mcp — MCP protocol endpointGET /health — health checkGET / — service informationTesting with public URL (localtunnel):
For testing with remote access:
npm install -g localtunnel npm start lt --port 3000 --local-host localhost {
"mcpServers": {
"oa-y-remote": {
"url": "https://random-subdomain.loca.lt/mcp?API_TOKEN=your_token&API_TOKEN_LIBS=your_libs_token&APP_ENV=prod"
}
}
}This section describes how to deploy the MCP service for production use.
This mode allows users to install your MCP service directly from GitHub using npx.
Requirements:
oa-y-mcp-service.cjs file committed to repositoryDeployment Steps:
npm run buildThis creates oa-y-mcp-service.cjs — the bundled file that includes all dependencies.
git add oa-y-mcp-service.cjs
git commit -m "Build MCP service for distribution"
git push origin main {
"mcpServers": {
"oa-y-mcp-service": {
"command": "npx",
"args": ["github:AdminRHS/oa-y-mcp-service"],
"env": {
"APP_ENV": "prod",
"API_TOKEN": "user_token",
"API_TOKEN_LIBS": "user_libs_token"
}
}
}
}Important:
npm run buildoa-y-mcp-service.cjs must be committed to the repositorynpxThis mode deploys the MCP service as an HTTP server using Docker.
Requirements:
Deployment Steps:
git clone https://github.com/AdminRHS/oa-y-mcp-service.git
cd oa-y-mcp-service PORT=3000 docker-compose up -d curl http://localhost:3000/health {
"mcpServers": {
"oa-y-remote": {
"url": "http://your-server-ip:3000/mcp?API_TOKEN=user_token&API_TOKEN_LIBS=user_libs_token&APP_ENV=prod"
}
}
}Docker Compose Configuration:
The service uses docker-compose.yml and Dockerfile:
.env)Updating the Deployment:
To update the service on the server:
git pull origin main
docker-compose down
docker-compose up -d --buildMonitoring:
View logs:
docker-compose logs -fCheck container status:
docker-compose psProduction Recommendations:
All responses follow the MCP (Model Context Protocol) JSON-RPC 2.0 format. See MCP documentation for details.
npm run dev - Run STDIO mode (local development)npm run dev:inspect - Run STDIO mode with Inspectornpm run http - Run HTTP server modenpm run http:inspect - Run HTTP server with Inspectornpm start - Start HTTP server (default)npm run build - Build bundled version (oa-y-mcp-service.cjs)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.