PPortal Data MCP
Connect guide

Use portal data in your AI tools

Read courses, units, questions and tags from the beta and prod portals inside Claude (web, desktop or Code), Codex or Cursor, or from any script. One account, one token per app, and your own access level everywhere.

MCPhttps://3-6-75-122.sslip.io/mcp/
RESThttps://3-6-75-122.sslip.io/api

1 · Get access

  1. Request an account on Request access with your @nxtwave.co.in email.

  2. Send your signup code to an Admin from your own work chat. They approve you and set your role and portal access.

  3. Create a token on Tokens, one per app. It starts with pmcp_, is shown once, and lasts 90 days.

Roles

L1 Associate · L2 Manager · L3 Admin. Managers and Admins approve and manage access.

Access per portal

READ · EDIT · WRITE, set separately for beta and prod. Reading needs READ on that portal.

Keep tokens private

A token acts as you. Keep it in an environment variable, never in a sheet, a chat or a committed file.

2 · Connect your app

Replace pmcp_YOUR_TOKEN with your token. Tip: the Tokens page shows these same steps with your new token already filled in.

save the token once · macOS / Linux (~/.zshrc or ~/.bashrc)
export PORTAL_MCP_TOKEN="pmcp_YOUR_TOKEN"

Windows PowerShell: setx PORTAL_MCP_TOKEN "pmcp_YOUR_TOKEN", then open a new terminal. Apps below read the token from this variable, so it stays out of config files.

  1. Add the server for all your projects:

    terminal
    claude mcp add --transport http --scope user portal-data \
      https://3-6-75-122.sslip.io/mcp/ \
      --header "Authorization: Bearer $PORTAL_MCP_TOKEN"
  2. Or as JSON. Put this in a project's .mcp.json to share it with that project; each person's own token is filled in from their environment:

    .mcp.json
    {
      "mcpServers": {
        "portal-data": {
          "type": "http",
          "url": "https://3-6-75-122.sslip.io/mcp/",
          "headers": { "Authorization": "Bearer ${PORTAL_MCP_TOKEN}" }
        }
      }
    }
  3. Check: run claude mcp list, or /mcp inside Claude Code. Then ask “run whoami on portal-data”.

3 · Check it works

Ask your app to run whoami. You should see your role and your permissions on each portal:

whoami
{
  "email": "name@nxtwave.co.in",
  "role": "L1",
  "role_name": "Associate",
  "permissions": { "beta": ["READ", "EDIT", "WRITE"], "prod": ["READ", "EDIT"] },
  "unread_notifications": 0
}

Then ask real questions. Always name the portal; the server never guesses between beta and prod.

try asking
Search courses for "html.*css" on beta.
List the units of course <course_id> on prod.
Show question <question_id> on beta with its options and tags.
Which units use question <question_id> on prod?
Courses with several versions: course-level tools list the versions instead of picking one. Choose a version id, or “all”.

MCP tools

27 tools · read-only

Every data tool takes env ("beta" or "prod") and needs READ on that portal. Full input schemas: mcp-tools.json.

ToolWhat it does
You and the server
whoamiWho you are on this server: role, BETA/PROD permissions, and what's waiting.
my_notificationsYour in-app updates: account decisions, access changes, approvals waiting on you.
list_environmentsList the portal environments available, so you can ask the user which to use.
list_admin_modelsBrowse the surveyed admin schema: models, row counts and columns.
get_admin_modelGet one admin model's columns, fields, relations and inlines.
Courses
search_coursesFind courses by id or by a regex over the title.
get_course_detailsGet a course's details (name, description, duration, category, link).
list_course_versionsList a course's versions, flagging the latest.
get_course_treeGet a course's tree: details → ordered topics → each topic's units.
list_course_unitsList a course's units as flat rows (course, topic and unit fields together).
diff_course_versionsShow what changed between two course versions: units added, removed or moved.
get_course_tagsList every concept tag used across a course, with per-unit attribution.
Links between resources
get_resource_childrenList what a resource links to: a course's topics, or a topic's units.
get_resource_parentsList what links to a resource — the topics a unit sits in, and so on.
get_unit_ancestryShow every (topic, course) path a unit is reachable through.
Units
get_unitGet a unit with the details specific to its type.
get_unitsGet several units at once (concurrently), in the order requested.
get_unit_questionsList a unit's questions in order, optionally enriched.
get_unit_slidesGet slides and reading content for a LEARNING_SET unit.
get_unit_tagsGet a unit's own tags plus a histogram of the concept tags its questions carry.
get_unit_tag_coverageCheck how many of each unit's questions carry each tag (unit × tag matrix).
Questions and tags
search_questionsFind questions by id, or by a regex over their short text.
get_questionGet a question in full: metadata, body, tags, and its type-specific payload.
get_questionsGet several questions concurrently, in the order requested.
get_question_tagsList the concept tags attached to one question.
get_question_usageList the units that include a question (exams and question sets).
get_tag_questionsList every question id carrying a tag, across all courses.

REST API

27 routes

Send Authorization: Bearer pmcp_… on every request. Try any route in the browser at https://3-6-75-122.sslip.io/api/docs: click Authorize and paste your token.

MethodPathParameters * requiredReturns
Meta
GET /api/health none Health
GET /api/environments none Environments
POST /api/environments/{env}/login env* Login
Schema
GET /api/schema/models app, search, env Schema Models
GET /api/schema/models/{app_name}/{model} app_name*, model*, env Schema Model
Courses
GET /api/courses q*, limit, env Search Courses
GET /api/courses/{course_id} course_id*, version_id, env Get Course
GET /api/courses/{course_id}/versions course_id*, env Course Versions
GET /api/courses/{course_id}/tree course_id*, version_id, include_unit_names, unit_details, env Course Tree
GET /api/courses/{course_id}/units course_id*, version_id, unit_type, include_unit_names, env Course Units
GET /api/courses/{course_id}/version-diff course_id*, from_version, to_version, include_unit_names, env Course Version Diff
GET /api/courses/{course_id}/tags course_id*, version_id, unit_type, env Course Tags
Links
GET /api/resources/{resource_id}/children resource_id*, describe, env Resource Children
GET /api/resources/{resource_id}/parents resource_id*, describe, env Resource Parents
GET /api/units/{unit_id}/ancestry unit_id*, env Unit Ancestry
Units
GET /api/units/{unit_id} unit_id*, include_questions, env Get Unit
POST /api/units/batch env
body {"unit_ids", "detail"}
Get Units
GET /api/units/{unit_id}/questions unit_id*, include_details, include_tags, include_content, full_detail, env Unit Questions
GET /api/units/{unit_id}/slides unit_id*, token, include_content, env Unit Slides
GET /api/units/{unit_id}/tags unit_id*, include_question_tags, env Unit Tags
Questions
GET /api/questions q*, limit, env Search Questions
GET /api/questions/{question_id} question_id*, include_content, include_tags, full_detail, env Get Question
POST /api/questions/batch env
body {"question_ids", "include_content", "include_tags", "full_detail"}
Get Questions
GET /api/questions/{question_id}/tags question_id*, env Question Tags
GET /api/questions/{question_id}/usage question_id*, env Question Usage
Tags
GET /api/tags/{tag_name}/questions tag_name*, env Tag Questions
POST /api/tags/coverage env
body {"unit_ids", "tag_names"}
Tag Coverage

JSON

Ready-to-paste JSON config for each app, and the API and tools as JSON files.

Claude Code · .mcp.json
{
  "mcpServers": {
    "portal-data": {
      "type": "http",
      "url": "https://3-6-75-122.sslip.io/mcp/",
      "headers": { "Authorization": "Bearer ${PORTAL_MCP_TOKEN}" }
    }
  }
}
Cursor · ~/.cursor/mcp.json
{
  "mcpServers": {
    "portal-data": {
      "url": "https://3-6-75-122.sslip.io/mcp/",
      "headers": { "Authorization": "Bearer ${env:PORTAL_MCP_TOKEN}" }
    }
  }
}
Claude Desktop · claude_desktop_config.json
{
  "mcpServers": {
    "portal-data": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://3-6-75-122.sslip.io/mcp/", "--header", "Authorization:${AUTH_HEADER}"],
      "env": { "AUTH_HEADER": "Bearer pmcp_YOUR_TOKEN" }
    }
  }
}

Errors & fixes

You seeMeaningFix
401 · “Not signed in” · server disconnectedToken missing, mistyped, expired or revoked, or account suspendedCreate a new token on Tokens; check the env variable is set where the app starts
403 · “you don't have PROD READ”No access to that portalAsk a Manager or Admin to switch it on
environment_requiredBeta or prod wasn't namedSay which portal, e.g. “on beta”
version_requiredThe course has several versionsPick a version id from the list, or “all”
422A required parameter is missingCheck the route in /api/docs
Can't sign inWrong password; 5 wrong tries lock the account for 15 minutesWait, or ask a Manager or Admin for a reset link
Not supported yet: ChatGPT connectors only connect to servers with an OAuth sign-in, so they can't use a personal token. Use the apps above or the REST API.