{"server":{"name":"com.secdim/mcp","icons":[{"src":"https://secdim.com/assets/images/logo-square.svg","sizes":["any"],"mimeType":"image/svg+xml"}],"$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","remotes":[{"url":"https://mcp.secdim.com/mcp","type":"streamable-http"}],"version":"1.0.1","repository":{"url":"https://github.com/secdim/mcp","source":"github"},"description":"Personalised developer security learning pathways from SecDim's challenges and courses."},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","isLatest":true,"updatedAt":"2026-07-20T05:19:20.145184Z","publishedAt":"2026-07-20T05:19:20.145184Z","statusChangedAt":"2026-07-20T05:19:20.145184Z"},"dev.protogrid/connectability":{"class":"R0","autonomous":true,"human_steps":[],"preferred":{"kind":"remote","idx":0},"remotes":[{"idx":0,"url":"https://mcp.secdim.com/mcp","transport":"streamable-http","templated":false,"headers":[],"auth":{"type":"none","location":null,"secret_name":null,"oauth":null},"protocol":{"supported_versions":["2025-11-25"],"stateless":true},"health":{"reachable":true,"uptime_30d":1,"latency_ms_p50":427,"consecutive_failures":0,"last_probe_at":"2026-10-20T02:35:36.897Z","last_ok_at":"2026-10-20T02:35:36.897Z"}}],"packages":[]},"dev.protogrid/tools":[{"name":"fetch","title":null,"description":"\n    Fetch detailed content for a specific SecDim Play lab (hands-on, scored challenge).\n\n    Args:\n        id: Lab ID in format \"lab:slug\" (e.g., \"lab:xss-dom\")\n\n    Returns:\n        Dictionary containing:\n        - id: The lab ID\n        - title: Lab title\n        - content: Detailed content in markdown format\n        - metadata: Additional lab information\n    ","annotations":null,"source":"probe","observed_at":"2026-10-20T02:35:36.897Z"},{"name":"get_learn_course","title":null,"description":"\n    Get a SecDim Learn course's details, including its syllabus of topics.\n\n    Args:\n        course_slug: The course's slug, as returned by search_learn_courses\n            (e.g. \"owasp-top-10\")\n\n    Returns:\n        Dictionary with the course's title, description, image, slug, \"difficulty\"\n        label and a \"topics\" list. Each topic includes its title, description,\n        category, slug, kind (e.g. text/video/lab), level, subscription tier,\n        duration and completion status.\n        Use get_learn_topic with the course slug and a topic's slug to view its content.\n    ","annotations":null,"source":"probe","observed_at":"2026-10-20T02:35:36.897Z"},{"name":"get_learn_topic","title":null,"description":"\n    Get a SecDim Learn topic's content.\n\n    Args:\n        course_slug: The course's slug, as returned by search_learn_courses\n            (e.g. \"owasp-top-10\")\n        topic_slug: The topic's slug, as returned by get_learn_course\n            (e.g. \"introduction-secure-coding\")\n\n    Returns:\n        Dictionary with the topic's title, description, category, kind, level,\n        subscription tier, duration, completion status and \"file_content\" (the\n        topic's content in AsciiDoc format).\n        If the topic requires a SecDim Learn subscription that the current account\n        does not have, an \"error\" explaining this is returned instead.\n    ","annotations":null,"source":"probe","observed_at":"2026-10-20T02:35:36.897Z"},{"name":"get_secdim_profile","title":null,"description":"\n    Fetch a SecDim player's profile: scores, completed challenges, skills,\n    security interests and an experience estimate.\n\n    Use this tool to understand a player's demonstrated secure coding ability\n    before building a learning pathway. The profile includes actual challenge\n    completion data (by difficulty level) and security topics the player has\n    practised — weight this demonstrated performance over a user's self-reported\n    level when deciding what difficulty and topics to recommend.\n\n    The 'guidance' field provides a ready-to-use summary of what difficulty and\n    topics to target next, and whether the player is new, intermediate or\n    experienced.\n\n    Args:\n        secdim_username: The player's SecDim username (e.g. \"alice\")\n\n    Returns:\n        Dictionary with scores, challenges_solved breakdown, skills (languages\n        and technologies), completed_challenges list, security_interests,\n        experience_estimate and guidance. If the user doesn't exist or an error\n        occurs, returns an error dict.\n    ","annotations":null,"source":"probe","observed_at":"2026-10-20T02:35:36.897Z"},{"name":"search","title":null,"description":"\n    Search for SecDim Play secure coding labs (hands-on, scored challenges).\n\n    This tool searches across SecDim Play's hands-on secure coding labs based on the\n    search query. The backend API handles parsing of vulnerability names, CWE IDs, and OWASP IDs.\n\n    Language can be specified using the format \"lang:javascript\".\n\n    Args:\n        query: Search query that may include:\n               - Vulnerability names (e.g., \"XSS\", \"SQL injection\")\n               - CWE IDs (e.g., \"79\")\n               - OWASP IDs (e.g., \"A03:2021\")\n\n               Examples:\n               - \"XSS lang:javascript\" - searches for XSS labs in JavaScript\n               - \"SQL injection lang:Python\" - searches for SQL injection labs in Python\n               - \"79\" - searches for labs related to CWE-79\n\n    Returns:\n        Dictionary with search results containing:\n        - results: List of matching SecDim Play labs with id, title, snippet, and metadata\n    ","annotations":null,"source":"probe","observed_at":"2026-10-20T02:35:36.897Z"},{"name":"search_learn_courses","title":null,"description":"\n    Search SecDim Learn courses.\n\n    SecDim Learn provides tutorial-based courses (mixing video, text and hands-on\n    lab topics) covering secure coding, secure design, vibe coding security, devsecops,\n    and cloud security. Many courses are complementary or prerequisite to hands-on,\n    scored SecDim Play challenges/labs.\n\n    Use this tool to:\n    - Browse the SecDim Learn course catalogue\n    - Find courses related to a topic, language, or technology (e.g. \"OWASP Top 10\",\n      \"fuzzing\", \"Python\")\n\n    Args:\n        search: Optional search term to filter courses by title, description, or tags.\n            If omitted, returns the full course catalogue.\n\n    Returns:\n        Dictionary with a \"courses\" list. Each course includes its title, description,\n        image, slug, tags, numeric \"level\" (1=beginner, 2=intermediate, 3=advanced) and\n        a \"difficulty\" label.\n        Use get_learn_course with a course's slug to view its syllabus of topics.\n    ","annotations":null,"source":"probe","observed_at":"2026-10-20T02:35:36.897Z"},{"name":"search_play_challenges","title":null,"description":"\n    Return a list of hands-on SecDim Play secure coding challenges (labs) related to a detected or suspected vulnerability.\n\n    SecDim Play challenges are scored, hands-on labs: find and fix a real vulnerability\n    in running code to earn points and badges.\n\n    Use this tool to:\n    - Find hands-on SecDim Play labs for specific vulnerabilities like XSS, SQL Injection, etc.\n    - Explore OWASP Top 10 vulnerabilities and related labs\n    - Provide additional resources and guides to help developers improve their secure coding skills\n\n    For structured tutorial content (text, video, and lab-based courses) on the same\n    vulnerability, use search_learn_courses (SecDim Learn) instead or in addition.\n\n    Args:\n        search: Search term for the vulnerability (e.g., 'xss', 'sql-injection', 'injection')\n        cwe: Common Weakness Enumeration (CWE) ID to filter by\n        owasp: OWASP category to filter by (e.g., 'a03:2021')\n        technology: Technology or framework to filter by (e.g., 'react', 'django')\n        language: Programming language to filter by (e.g., 'javascript', 'python')\n        difficulty: Difficulty level to filter by (e.g., 'trivial', 'easy', 'medium', 'hard')\n        type: Challenge format to filter by (e.g., 'battle', 'exploitation', 'incident-response')\n        mitre: MITRE ATT&CK ID to filter by (e.g., 'T1102.003')\n\n    SecDim Play challenges (labs) each simulate a real vulnerability. They are scored according to\n    the following difficulty levels:\n        - Trivial: Easy to find and path vulnerabilities. It can be completed in 5-10 minutes. 1-15 points.\n        - Easy: Known vulnerabilities. It can be completed in 10-30 minutes. 16-35 points.\n        - Medium: Known vulnerabilities but require defence-in-depth patch. It can be completed in 20-30 minutes. 36-70 points.\n        - Hard: Hard to find or patch vulnerabilities. It can be completed in 30-60 minutes. 71-100 points.\n        - Battle: SecDim Flagship attack and defence challenge that require both vulnerability exploitation and mitigation skills. Points are accumulated.\n\n    Returns:\n        Dictionary containing SecDim Play labs results or error\n        If there are no results, user can perform a manual search on the SecDim Play frontend (SECDIM_PLAY_FRONTEND_BASE_URL)\n    ","annotations":null,"source":"probe","observed_at":"2026-10-20T02:35:36.897Z"}],"dev.protogrid/trust":{"score":90,"components":{"hygiene":100,"liveness":100,"freshness":65,"provenance":90},"drivers":["+repository","+namespace-matches-repo","+dns-namespace","+reachable","+uptime-100%","~updated-92d-ago"],"flags":[],"blocked":false,"computed_at":"2026-10-20T07:15:33.232Z","disclaimer":"Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed."},"dev.protogrid/quality":{"score":76,"label":"good","components":{"auth":null,"hygiene":64,"protocol":75,"stability":100,"dependencies":null},"checks":[{"id":"protocol.modern","detail":"newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28","status":"warn","category":"protocol"},{"id":"protocol.stateless","detail":"only applies to 2026-07-28 servers","status":"na","category":"protocol"},{"id":"protocol.transport","detail":"streamable HTTP","status":"pass","category":"protocol"},{"id":"protocol.list_ttl","detail":"only applies to 2026-07-28 servers","status":"na","category":"protocol"},{"id":"auth.prm","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.as_metadata","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.cimd","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.secret_in_url","detail":"no templated URL","status":"na","category":"auth"},{"id":"tools.descriptions","detail":"every tool has a description","status":"pass","category":"hygiene"},{"id":"tools.description_length","detail":"2 tools have descriptions over 1,024 characters, which crowds the context","status":"warn","category":"hygiene"},{"id":"tools.schemas","detail":"every tool has an object input schema","status":"pass","category":"hygiene"},{"id":"tools.annotations","detail":"no tool declares readOnlyHint or destructiveHint, so clients cannot tell safe calls from risky ones","status":"fail","category":"hygiene"},{"id":"tools.directory_hints","detail":"no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: search (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); get_learn_course (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); get_learn_topic (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); …","status":"fail","category":"hygiene"},{"id":"tools.token_cost","detail":"about 2,176 tokens to load every tool","status":"pass","category":"hygiene"},{"id":"tools.api_dump","detail":"tools are not a one-to-one API dump","status":"pass","category":"hygiene"},{"id":"stability.changes","detail":"no tool changes in 30 days","status":"pass","category":"stability"},{"id":"stability.rug_pull","detail":"no tool changed its meaning under the same name","status":"pass","category":"stability"},{"id":"deps.known_vulns","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.mcp_sdk_version","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.resolvable","detail":"no npm or PyPI package","status":"na","category":"dependencies"}],"drivers":["-tools.annotations","-tools.directory_hints","~protocol.modern","~tools.description_length"],"flags":[],"tool_count":7,"token_estimate":2176,"tools_hash":"e848728dcd558292b78a9b88569f0402","tools_changed_at":null,"computed_at":"2026-10-20T07:21:44.986Z","disclaimer":"Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed."},"dev.protogrid/identity":{"canonical_id":"com.secdim/mcp","aliases":[],"alias_count":0,"repository_key":"github:secdim/mcp","owner":{"verified":false,"method":null,"since":null}}},"next_actions":[{"action":"list_tools","description":"Every current tool with input schemas","href":"/v1/servers/com.secdim%2Fmcp/tools","arguments":{"name":"com.secdim/mcp"}},{"action":"get_connection","description":"Minimal connection block for the preferred remote or package","href":"/v1/servers/com.secdim%2Fmcp/connection?target=mcpServers","arguments":{"name":"com.secdim/mcp","target":"mcpServers"}},{"action":"search","description":"Find other servers by intent","href":"/v1/search?q={query}","arguments":{"q":"{query}"}}]}