Skip to main content

neopat-mcp

PyPI Python 3.11+ License: MIT ci

An MCP server for the NeoPAT campus placement portal. It lets an AI assistant browse your drives, fill in each company's application form from your profile, and file applications — with your explicit confirmation every time.

Features

  • Stays signed in — signs in with your credentials and renews the session itself, or works from a token you paste.
  • Browse and search drives — filter by eligibility, open deadlines, or whether you have already applied.
  • Answers filled from your profile — marks, backlogs, registration number, contact details and location are taken from the portal's own record of you, and each one reports where it came from.
  • Asks you for the rest — on clients that support elicitation, the server prompts you directly for answers it cannot infer.
  • Two-step applications — nothing is submitted without a confirmation token issued by a preview you have seen.
  • Interview schedule — upcoming rounds across every drive you opted into.
  • Typed responses — every tool publishes an output schema.

Requirements

  • Python 3.11 or newer
  • uv
  • An account on a NeoPAT placement portal

Installation

Claude Desktop — one click

Download neopat-mcp.mcpb from the latest release and open it. Claude Desktop installs it and asks for your credentials, which it keeps in your operating system's keychain rather than in a file.

Everything else

No clone or checkout needed — uvx fetches and runs it:

uvx --from neopat-mcp neopat-mcp

Add it to any client with one of the configurations below.

From source
git clone https://github.com/Udhay-Adithya/neopat-mcp.git
cd neopat-mcp
uv sync

Then point your client at .venv/bin/python -m neopat_mcp.server.

Configuration

Credentials go in your client's env block (shown under Usage), or in a .env.local file when running from a checkout.

There are two ways to authenticate. Pick one.

NEOPAT_EMAIL="you@example.com"
NEOPAT_PASSWORD="your-portal-password"

The server signs in once and caches the session in .neopat-session.json (gitignored, mode 0600). Access tokens last 24 hours; a refresh token renews them automatically, so your password is used once and the session keeps itself alive after that.

Repeated rejections stop further attempts rather than retrying in a loop — that is how accounts get locked. Fix the credentials and call sign_in.

Paste a token

NEOPAT_TOKEN="paste-auth_token-here"

From DevTools → Application → Local Storage → auth_token. No password is stored, but the token expires after 24 hours and cannot renew itself, so you replace it by hand. It takes precedence when both are configured.

This bookmarklet copies the current token in one click:

javascript:(()=>{navigator.clipboard.writeText(localStorage.getItem('auth_token'));alert('Token copied');})()

All settings

Variable Default Purpose
NEOPAT_EMAIL — Portal email, for automatic sign-in.
NEOPAT_PASSWORD — Portal password. Used at sign-in, never stored.
NEOPAT_TOKEN — A token copied from the browser, instead of the above.
NEOPAT_BASE_URL https://api.neopat.ai/api/v1 API root.
NEOPAT_MIN_INTERVAL_MS 700 Minimum gap between requests.
NEOPAT_CONFIRM_TTL_SECONDS 600 Confirmation token lifetime.

The session is cached under your user data directory — ~/.local/share/neopat-mcp on Linux, ~/Library/Application Support/neopat-mcp on macOS, %LOCALAPPDATA% on Windows — with permissions 0600. Set NEOPAT_HOME to move it.

When running from a checkout, .env.local is gitignored. Keep it that way: it holds a live credential.

Usage

Add to Cursor Add to VS Code

GitHub does not make badge links clickable in every view; the configurations below are the same thing written out. Replace the placeholder credentials with your own.

Every client runs the same command, so nothing below needs a checkout.

Claude Code
claude mcp add neopat \
  --env NEOPAT_EMAIL=you@example.com \
  --env NEOPAT_PASSWORD=your-password \
  -- uvx --from neopat-mcp neopat-mcp
Claude Desktop

Edit claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\):

{
  "mcpServers": {
    "neopat": {
      "command": "uvx",
      "args": ["--from", "neopat-mcp", "neopat-mcp"],
      "env": {
        "NEOPAT_EMAIL": "you@example.com",
        "NEOPAT_PASSWORD": "your-password"
      }
    }
  }
}
Cursor

.cursor/mcp.json, or ~/.cursor/mcp.json for all projects:

{
  "mcpServers": {
    "neopat": {
      "command": "uvx",
      "args": ["--from", "neopat-mcp", "neopat-mcp"],
      "env": {
        "NEOPAT_EMAIL": "you@example.com",
        "NEOPAT_PASSWORD": "your-password"
      }
    }
  }
}
VS Code (Copilot agent mode)

.vscode/mcp.json:

{
  "servers": {
    "neopat": {
      "type": "stdio",
      "command": "uvx",
      "args": ["--from", "neopat-mcp", "neopat-mcp"],
      "env": {
        "NEOPAT_EMAIL": "you@example.com",
        "NEOPAT_PASSWORD": "your-password"
      }
    }
  }
}
Windsurf

~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "neopat": {
      "command": "uvx",
      "args": ["--from", "neopat-mcp", "neopat-mcp"],
      "env": {
        "NEOPAT_EMAIL": "you@example.com",
        "NEOPAT_PASSWORD": "your-password"
      }
    }
  }
}
Zed
{
  "context_servers": {
    "neopat": {
      "command": {
        "path": "uvx",
        "args": ["--from", "neopat-mcp", "neopat-mcp"],
        "env": {
          "NEOPAT_EMAIL": "you@example.com",
          "NEOPAT_PASSWORD": "your-password"
        }
      }
    }
  }
}
Cline / Roo

cline_mcp_settings.json:

{
  "mcpServers": {
    "neopat": {
      "command": "uvx",
      "args": ["--from", "neopat-mcp", "neopat-mcp"],
      "env": {
        "NEOPAT_EMAIL": "you@example.com",
        "NEOPAT_PASSWORD": "your-password"
      },
      "disabled": false
    }
  }
}
Any other MCP client

A standard stdio server:

uvx --from neopat-mcp neopat-mcp

with NEOPAT_EMAIL and NEOPAT_PASSWORD in the environment.

Ask your assistant to run health to confirm the connection.

Tools

Reading

Tool Description
health Token validity, expiry, and the portal's drive counts.
auth_status How the server is authenticating and whether it can renew itself.
sign_in Sign in with the configured email and password.
sign_out Discard the cached session.
token_status Time left on the token, without calling the portal.
list_drives List drives. Filter by eligible, only_open, exclude_applied, search.
search_drives The portal's own search — faster, and matches more fields.
get_drive One drive in full, including its application questions.
check_eligibility The portal's eligibility verdict for a drive, and why.
my_profile Your profile, with marks and other common answers promoted.
profile_completeness Which profile sections the portal considers finished.
saved_resumes Resumes saved on the portal.
code_profiles LeetCode/HackerRank status and whether your college requires them.
my_schedule Interview rounds on drives you opted into.
portal_features Which features your college has enabled.
filter_options Drive types, domains and company categories in use.
notifications Recent portal notifications.

Writing

Tool Description
preview_application Build and validate the application. Submits nothing.
apply_to_drive Submit the previewed application.
preview_withdrawal Build a withdrawal. Submits nothing.
withdraw_application Submit the withdrawal.

Prompts

Prompt Description
find_drives_for_me Shortlist open drives that fit you, with reasons.
apply_to Walk through applying to a named company.
why_not_eligible Explain which criteria a drive rules you out on.
readiness_check Check nothing blocks applying before a deadline rush.
whats_next Upcoming interviews and deadlines about to pass.

Resources

URI Description
neopat://profile Your profile, for grounding answers.
neopat://drives/open Drives still open and not yet applied to.

How applying works

Applying takes two calls, and the second one cannot invent anything.

get_drive  ->  preview_application  ->  [you approve]  ->  apply_to_drive

preview_application reads the drive's questions, fills in what your profile answers, asks you for the rest, and validates everything. It returns a single-use confirmation token bound to that drive and to a hash of the exact request body.

apply_to_drive takes no payload. It can only replay a body that was already previewed. An assistant cannot apply as a side effect of browsing, cannot apply to a drive other than the one you were shown, and cannot alter an answer between your approval and the request.

No token is issued at all when something is wrong — you are ineligible, the deadline has passed, a mandatory question is unanswered, an answer is not one of the permitted options, or the portal already records you as applied.

Answers are keyed by question id, never by question text:

{
  "drive_id": "...",
  "answers": { "8af2166d-8202-4932-b5a7-f3a01c80d7e9": "Development" }
}

Free-text questions about marks, backlogs, contact details and location are filled from your profile automatically and reported in auto_answered. Multiple-choice questions are never answered for you — picking an option is a preference, not a lookup.

Development

uv sync --all-groups
.venv/bin/python -m pytest

Tests run against a stubbed portal and never contact the real one.

src/neopat_mcp/
├── schemas.py       Typed models for every response
├── parsing.py       Portal payloads -> schemas
├── applications.py  Question answering, validation, write payloads
├── client.py        HTTP: auth, rate limiting, retries, pagination
├── confirm.py       Single-use confirmation tokens
├── config.py        Settings and the hot-reloaded token
└── server.py        MCP tools, prompts and resources

docs/api-notes.md documents the portal's API behaviour, including several endpoints that fail in misleading ways.

Disclaimer

Unofficial, and not affiliated with or endorsed by NeoPAT. It automates actions you can already perform yourself, on your own account, with your own credentials. Opting into a drive files a real application with a real company — check your institution's placement policy before automating anything, and read every preview before confirming it.

License

MIT

Metadata

Release files for neopat-mcp 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for neopat-mcp 0.1.0
File Size Uploaded
neopat_mcp-0.1.0.tar.gz 127.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for neopat-mcp 0.1.0
File Interpreter ABI Platform
neopat_mcp-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 169.2 kB

Release files / neopat_mcp-0.1.0.tar.gz

Download URL neopat_mcp-0.1.0.tar.gz
Size 127.1 kB
Tags Source
SHA-256 checksum
How to use checksums
a06fbd04a2442c24cf07e01f8a19318b8e3bf077315add50ac56384549659874
BLAKE2b-256 checksum
How to use checksums
e119c87d3ff3cc563b82b3316bf007847fe54ec9a9fef9a66123748edb964cfe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.

Transparency log

Release files / neopat_mcp-0.1.0-py3-none-any.whl

Download URL neopat_mcp-0.1.0-py3-none-any.whl
Size 42.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ae5196eb91f53d9bb13c03b9cff5543d6974e4c879eb5ac062d6b59e91ed972a
BLAKE2b-256 checksum
How to use checksums
19a35e6d61bca8d8ec6d3a706469e03b35f505411954715479f57ed28004fa2a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.

Transparency log

Release history Release notifications | RSS feed

0.1.2

2 release files

0.1.1

2 release files

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page