oahelper-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@oahelper-mcpdownload Amazon's latest OA questions and solutions for offline prep"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
oahelper-mcp
Built by Sirjan Singh
An MCP server that lets Claude Code, Claude Desktop, Cursor, Codex or any other MCP client read your own OAHelper Pro account: company OA question sets, full problem statements, MCQ answer keys, official solutions and interview experiences. Everything it fetches is also saved as plain markdown on your disk, so you can prep offline, in Obsidian, or with an agent that never touches the network again.
It also ships 9 skills for mock OAs, MCQ drills, hint-based coaching, interview briefs, study plans and spaced revision.
The server is one small Python package with a single dependency (the official mcp SDK).
HTTP is the standard library.
Quick install
You use | One command |
Claude Code (server + all 9 skills) |
|
Just the skills, any agent |
|
Just the server, any MCP client |
|
The Claude Code plugin asks for your OAHelper cookie when you enable it and keeps it in
secure storage. Its skills show up as /oahelper:oa-mock, /oahelper:mcq-drill and so on.
Read this first. OAHelper's Terms of Service forbid automated access and scraping, and the penalty can be losing your Pro account. This tool is built to be used the way a person uses the site: one company at a time, only when you ask, 2 seconds between requests, a hard daily cap (300 by default), and a disk cache so nothing is fetched twice. It uses your own logged-in browser session, ships no content, and gives you nothing your plan does not already include. Whether to run it is your decision and your risk. Do not use it to crawl the site, and never publish or share what it saves.
Related MCP server: coursera
What you get
Tool | What it does | Network |
| Lists a company's OA sets with dates, counts and refs | 1 request (cached 1 day) |
| Downloads a company's sets, questions, MCQ answers and interview write-ups into the library, newest first. Stops after | up to |
| One set page by slug or | 1 request |
| One question: statement, MCQ answers with explanations, optional images and community solutions | 1 to 4 requests |
| Official solution ( | 1 request |
| Interview experiences for a company, full text saved | 1 to 2 requests |
| What is already saved. Works with no session at all | none |
| Is a session configured, requests used today, optional Pro check | none or 1 |
The library layout:
library/<company>/
index.md sets, interviews and counts, with links
sets/<ref>-<name>.md
questions/<ref>-<title>.md
interviews/<id>-<role>.md
images/ only when you ask for themAll of it lives in your data folder: ~/.oahelper by default, the repo folder when you
run from a clone, or wherever OAHELPER_HOME points. Inside a clone, library/, cache/
and .env are gitignored. Keep it that way.
Requirements
uv (recommended), or Python 3.10+ with pip
An OAHelper account (most content needs Pro)
Any MCP client that can launch a local stdio server
Add your session
Open https://www.oahelper.in in your browser while logged in.
Press F12, open the Network tab, reload, and click any request whose URL contains
/api/proxy/.Under Request Headers, copy the whole
cookievalue.Put it in
~/.oahelper/.env(create the folder and file) as one line:OAHELPER_COOKIE=<paste here>.env.examplelists the other optional settings. You can instead setOAHELPER_COOKIEas an environment variable in your client's config, and the Claude Code plugin asks for it when you enable it.
The session lasts until you log out on the site. When tools start returning
session rejected, repeat these steps. Treat the cookie like a password: do not paste it
into a chat with any AI, and do not commit it.
Then ask your agent to run oahelper_status with online=true. You should see
session valid | Pro: yes.
Connect it to your agent
With uv installed, every client runs the same command and uv fetches everything else:
uvx --from git+https://github.com/SirjanSingh/oahelper-mcp oahelper-mcpClaude Code
claude mcp add oahelper -s user -- uvx --from git+https://github.com/SirjanSingh/oahelper-mcp oahelper-mcp-s user makes it available in every project; use -s local for the current project
only. Run claude mcp list to confirm it shows as connected, or /mcp inside a session.
Or skip this and install the plugin, which also brings the skills.
Claude Desktop
Edit claude_desktop_config.json (Settings, Developer, Edit Config):
{
"mcpServers": {
"oahelper": {
"command": "uvx",
"args": ["--from", "git+https://github.com/SirjanSingh/oahelper-mcp", "oahelper-mcp"]
}
}
}Restart Claude Desktop.
Cursor
Same JSON as Claude Desktop, in ~/.cursor/mcp.json (all projects) or
.cursor/mcp.json (one project).
VS Code (Copilot agent mode)
.vscode/mcp.json uses a servers key:
{
"servers": {
"oahelper": {
"type": "stdio",
"command": "uvx",
"args": ["--from", "git+https://github.com/SirjanSingh/oahelper-mcp", "oahelper-mcp"]
}
}
}OpenAI Codex CLI
codex mcp add oahelper -- uvx --from git+https://github.com/SirjanSingh/oahelper-mcp oahelper-mcpor in ~/.codex/config.toml:
[mcp_servers.oahelper]
command = "uvx"
args = ["--from", "git+https://github.com/SirjanSingh/oahelper-mcp", "oahelper-mcp"]Gemini CLI, Windsurf, Cline and others
Any client that reads an mcpServers JSON block takes the Claude Desktop snippet
unchanged. Check your client's docs for where its config file lives.
Without uv (from a clone)
git clone https://github.com/SirjanSingh/oahelper-mcp.git
cd oahelper-mcp
python -m venv .venv
.venv/bin/pip install -r requirements.txt # Windows: .venv\Scripts\pipThen use /path/to/oahelper-mcp/.venv/bin/python /path/to/oahelper-mcp/server.py as the
command in any config above. In this mode .env, library/ and cache/ live in the
clone itself.
Using it
Ask in plain language. Some prompts that work well:
"What OA sets does OAHelper have for Juspay?"
"Sync Amazon from OAHelper, then tell me the topic mix of their last three OAs."
"Show me question
MjM3OHwwwith the MCQ answers.""Get the official C++ solution for that one."
"What have people said about Atlassian's interview rounds this year?"
"What do I already have saved offline?"
A typical prep loop: oahelper_sync a company (call again while it says NOT DONE),
then let the agent read library/<company>/index.md and the files it links. Reading the
library costs no requests.
Skills
The skills/ folder holds ready-made Agent Skills:
plain SKILL.md files that tell the agent how to chain the tools into a workflow. You
just ask in plain language and the matching skill kicks in.
Skill | Ask something like | What it does |
| "prep me for Juspay's OA" | Full prep guide: syncs the company, reads every saved set, adds public sources, maps each past question to the nearest LeetCode problem |
| "give me a mock OA for Amazon" | Timed mock built from real past questions in the real format, then graded with edge-case traces |
| "quiz me on DBMS MCQs from Infosys" | One MCQ at a time from real answer keys, with scoring and explanations |
| "I'm stuck on this question, give me a hint" | Hint ladder (observation, pattern, approach, pseudocode, code) and code review, official solution only on request |
| "what are Atlassian's interview rounds?" | Round-by-round brief from interview write-ups: repeated questions, what sank people, prep checklist |
| "compare the OAs of Uber, Juspay and Atlassian" | Side-by-side OA patterns and the shared topics worth studying first |
| "my OA is on Nov 3, make me a plan" | Day-by-day plan to the deadline, weighted by the company's topics and your past mistakes |
| "revise my mistakes" | Spaced-repetition re-test of questions you got wrong or needed hints on |
| "oahelper isn't connecting" | Step-by-step diagnosis of install, client config and session problems |
oa-mock, mcq-drill and solve-coach log every attempt to library/_progress.md, which
study-plan and revise-mistakes read. It stays on your machine with the rest of
library/.
Install the skills
Easiest, for Claude Code, Codex, Cursor and other agents that support skills:
npx skills add SirjanSingh/oahelper-mcpAdd --list to see them first, or --skill oa-mock to pick one. In Claude Code, the
plugin installs them together with the server.
By hand, for Claude Code in all projects:
cp -r skills/* ~/.claude/skills/On Windows PowerShell: Copy-Item -Recurse skills\* $HOME\.claude\skills\
For one project only, copy them into that project's .claude/skills/ instead. Restart
the session and they show up as /oa-prep, /oa-mock and so on, or trigger on their own
from what you ask.
Other agents: the files are plain markdown, so any agent that supports Agent Skills can
load them from its skills folder. For one that does not, paste the relevant SKILL.md
into its rules or custom instructions.
Configuration
In .env inside the data folder, or as environment variables of the same name
(environment wins):
Key | Default | Meaning |
|
| Data folder for |
| Browser | |
|
| |
| generic | Your browser's user agent, so requests match your session |
|
| Live requests per day before the server refuses |
The 2 second gap between requests is MIN_GAP in oahelper_mcp/server.py.
Troubleshooting
Symptom | Fix |
| Cookie expired. Copy a fresh one into |
| Wait until tomorrow. Cached and offline tools still work |
Client shows the server as failed | Check |
| The client is launching a different Python. Point |
Premium content missing | Your account is not Pro, or the cached copy was fetched logged out. Pass |
How it was built
The site has no public API. The endpoints were found by recording a HAR of normal
browsing on a personal account and summarising it with tools/har_endpoints.py, which
prints paths, parameter names and response shapes but never header values or response
content. If the site changes and something breaks, record a new HAR, run that script on
it, and compare.
Releasing (maintainer)
Bump the version in oahelper_mcp/__init__.py, .claude-plugin/plugin.json and both
version fields in server.json, commit, then push a tag:
git tag v0.2.1 && git push origin v0.2.1.github/workflows/release.yml checks the versions match, smoke-tests the wheel,
publishes to PyPI (trusted publishing, no token) and then to the
MCP Registry (GitHub OIDC, no token).
Author
I am Sirjan Singh. I built this to prep for my own placement OAs.
GitHub: @SirjanSingh
LinkedIn: Sirjan Singh
If this saved you prep time, star the repo. It is the only way I find out it helped someone, and it helps other people preparing for OAs find it. Issues and pull requests are welcome.
License
MIT, copyright (c) 2026 Sirjan Singh, for the code in this repository. It grants nothing over OAHelper's content, which belongs to OAHelper and its contributors.
This project is not affiliated with or endorsed by OAHelper.
Available Tools
8 toolsoahelper_companyA
List one OAHelper set page by slug or URL, e.g. "kickdrum-mcq24sep" or https://www.oahelper.in/company-questions/kickdrum-mcq24sep. Returns question refs for oahelper_question. For a company by name, use oahelper_search or oahelper_sync.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No | ||
| slug_or_url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it discloses almost nothing beyond the output hint 'Returns question refs'. Nothing is said about auth requirements, rate limits, caching, whether the 'refresh' flag triggers a network refetch, or whether the call is read-only versus mutating; the 'Returns question refs' line is also redundant since an output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with purpose, then identifier examples, then the sibling routing. Every sentence earns its place; only the slightly awkward 'List one OAHelper set page' phrasing costs a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter lookup tool with an output schema (so return values need no explanation), the description covers purpose, identifier format, and alternative tools adequately. The single real gap is the undocumented 'refresh' semantics, which keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does well for slug_or_url by giving two accepted formats (bare slug and full URL). However, the 'refresh' parameter is completely unexplained in both schema and description, leaving half the parameters opaque and capping this at a partial-credit 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List one OAHelper set page') and pins down the identifier format with two concrete examples ('kickdrum-mcq24sep', full URL). It also explicitly routes sibling confusion by stating that company-by-name lookups belong to oahelper_search or oahelper_sync, so an agent can differentiate it from its siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternatives (oahelper_search, oahelper_sync) and the condition that selects them ('For a company by name'), which is exactly the disambiguation an agent needs. It doesn't state the inverse condition as explicitly (use this when you already have a slug or URL) or any exclusions, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oahelper_interviewsA
Interview experiences for a company from OAHelper (12 per page, most relevant first). Saves each full write-up to library//interviews/ and returns a short list; read the saved files for the full text.
| Name | Required | Description | Default |
|---|---|---|---|
| pages | No | ||
| company | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses a side effect (saving full write-ups to library/<company>/interviews/), the pagination rate (12 per page, most relevant first), and that the return is only a short list. It omits overwrite behavior, auth/permission needs, and rate limits, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core resource front-loaded and the side effect plus the required follow-up action stated next. Every clause carries information; only minor polish is missing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with an output schema present, the description covers the essentials an agent needs: what is returned (a short list), where the full text lives, and the page size. Remaining gaps (whether re-running overwrites saved files, how `pages` interacts with results) are secondary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for both parameters, so the description must compensate. '12 per page' gives the agent a way to infer what `pages` means (pages × 12 results, default 2), and `company` is implicitly the lookup key, but neither is stated explicitly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource ('Interview experiences for a company') and its source (OAHelper), which is clear enough for an agent to distinguish it from oahelper_question or oahelper_solution. It does not explicitly contrast itself with oahelper_search, so sibling differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: fetch interview write-ups for a company, then 'read the saved files for the full text,' which is a useful follow-up instruction. There is no guidance on when to prefer this over oahelper_search or how to size the `pages` parameter, so no explicit when/when-not reasoning is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oahelper_offlineA
What is saved offline. No network call. With no company, lists every company in the library; with a company, returns its index (sets, interviews, counts).
| Name | Required | Description | Default |
|---|---|---|---|
| company | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it does disclose two real traits: the operation is a local/no-network read, and its output shape switches based on whether company is supplied. It does not mention staleness of the offline cache, sync prerequisites, or error behavior when a company is absent locally.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, with the core 'what is saved offline / no network call' framing front-loaded before the conditional behavior. Every sentence adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is not the description's job, and for a single-optional-parameter read tool this covers the essentials. Missing only offline-cache freshness/sync prerequisites, which would help an agent avoid stale results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the sole parameter has no description, so the description must compensate — and it does, fully defining the parameter's two modes (omitted = list all companies, supplied = that company's index). It only lacks format examples (e.g., exact company identifier form).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (the offline-saved library) and a specific dual behavior: full company list without a company, and that company's index (sets, interviews, counts) with one. It implicitly separates itself from network-based siblings via 'No network call', though it never names oahelper_sync or oahelper_company by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'No network call' implies the offline use case, which is genuine context for choosing this over a network-backed sibling. However, it never states when to prefer this over oahelper_company, oahelper_search, or oahelper_sync, so the selection logic is left for the agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oahelper_questionA
Read one OAHelper question: full statement, MCQ answers with explanations (for MCQ sets), any saved official solution, and optionally community solutions and images. Saves it to the offline library.
ref_or_url: a question ref like "MjM3OHww" or a https://www.oahelper.in/problems/... URL.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No | ||
| ref_or_url | Yes | ||
| include_images | No | ||
| include_community | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does reasonably well: it discloses the returned content set and, importantly, the side effect 'Saves it to the offline library,' which is not obvious from the name. It still omits whether the operation is read-only in effect, any auth requirements, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose followed by a focused parameter note; every line carries information with no filler. Minor looseness in the parenthetical about MCQ sets, but overall tight and well-ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is unnecessary, and the description covers the main behavior and the offline-save side effect. The remaining gap is the unexplained 'refresh' flag and lack of any safety/auth context, but it is largely complete for a single-item fetch tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It documents ref_or_url well with concrete format examples, and 'optionally community solutions and images' loosely maps to include_community/include_images, but the 'refresh' parameter is never explained and the two flags are not tied explicitly to their names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one OAHelper question') and enumerates the returned content (statement, MCQ answers with explanations, official solution, optional community/images), which clearly sets it apart from a search tool. It does not, however, name or differentiate itself against siblings like oahelper_search or oahelper_solution, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent infers it should call this when it has a question ref or URL and wants the full question. There is no explicit when-to-use, when-not-to-use, or pointer to an alternative such as oahelper_search for discovery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oahelper_searchA
Find a company's OA question sets on OAHelper by name (e.g. "Amazon", "Kickdrum").
Lists each set with its company_ref, date and question counts. To download a company's sets into the offline library, use oahelper_sync.
| Name | Required | Description | Default |
|---|---|---|---|
| company | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses the return shape (each set with company_ref, date and question counts) and implies a non-mutating lookup via "Find" and "Lists", but says nothing about authentication, rate limits, pagination, or whether results are capped — meaningful gaps for a search tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler. The purpose and the routing hint to oahelper_sync are front-loaded, and the return-contents sentence earns its place by telling the agent what to expect.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be fully documented, yet the description still summarizes them usefully. Purpose, input examples, and the alternative tool are all covered; only the absence of auth/limit context keeps it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter has 0% schema description coverage, so the description must compensate. It does so reasonably by naming the expected value type (company name) and giving two concrete examples, which is enough to invoke the tool correctly even though it doesn't state matching semantics (exact vs partial, case sensitivity).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Find a company's OA question sets on OAHelper by name") and includes concrete input examples ("Amazon", "Kickdrum"). It also explicitly distinguishes itself from the sibling oahelper_sync by contrasting retrieval with download, so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear when-to-use-this-instead condition: use oahelper_sync to download sets into the offline library rather than this tool. It does not clarify the boundary with oahelper_company or oahelper_question, leaving some sibling ambiguity, but the primary alternative is named explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oahelper_solutionA
Fetch OAHelper's official solution for one coding question (language: cpp, python, java). Each new fetch uses one of the account's limited daily solution requests, so only call this when the user asks for the official solution. Saved solutions are free.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | cpp | |
| ref_or_url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose the key non-obvious trait: each new fetch consumes one of a limited daily quota, while previously saved solutions are free. It does not mention authentication/account requirements or whether a fetch is idempotent/cacheable beyond the 'saved solutions are free' hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no waste; the quota constraint and the use-only-when-asked rule are front-loaded where the agent will see them before deciding to call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers purpose, languages, and quota behavior well. The remaining gap is the undocumented required parameter ref_or_url, whose accepted format an agent must guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It usefully enumerates the accepted languages (cpp, python, java), filling an enum gap the schema lacks, but says nothing about ref_or_url — the required parameter — such as whether it accepts an ID, slug, or full URL.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Fetch) plus a precise resource (OAHelper's official solution for one coding question), which is far more than a restatement of the name. It does not explicitly contrast itself with the closest sibling, oahelper_question, so the boundary between the two is left for the agent to infer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use rule ('only call this when the user asks for the official solution') backed by a cost rationale, and notes that saved solutions are free. It stops short of naming a specific alternative tool to use instead, so routing is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oahelper_statusA
Session and usage status. online=true also checks Pro status with the site (one request); by default no network call is made.
| Name | Required | Description | Default |
|---|---|---|---|
| online | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and it discloses the key side effect explicitly: online=true performs one network request against the site to check Pro status, while the default makes no network call. That is the most consequential behavioral trait for a status tool. It does not mention authentication requirements or rate/latency considerations, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, no filler, with the core purpose front-loaded before the conditional network behavior. Every clause carries information an agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the low-complexity single-parameter surface is well covered. The remaining gap is the absence of any statement about auth/session prerequisites for a tool whose whole purpose is reporting session status.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% — the schema exposes only a bare 'online' boolean with default false and no explanation. The description compensates by stating exactly what the flag does (triggers one network request to check Pro status) and what the default behavior is (no network call), which is meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete resource and outcome — 'Session and usage status' — so an agent immediately knows this reports current session/usage state rather than searching or syncing. It does not explicitly differentiate itself from siblings, but none of the siblings (search, company, sync, question, solution, interviews, offline) overlap with a status check, so mis-selection risk is low.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit statement of when to call this tool versus alternatives, nor any prerequisite (e.g., must be authenticated/logged in for session status to be meaningful). The only usage-like content is the conditional behavior of the 'online' flag, which is invocation detail rather than selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oahelper_syncA
Download one company's OAHelper content into the offline library, newest sets first: set lists, every question statement, MCQ answers, and interview experiences.
Makes at most max_items live requests per call, then says how much is left, so call it again to continue. Already-saved items cost nothing. Official solutions are NOT fetched here because each one uses the account's daily solution quota; use oahelper_solution. Read the result from library//index.md.
| Name | Required | Description | Default |
|---|---|---|---|
| company | Yes | ||
| max_items | No | ||
| include_images | No | ||
| include_interviews | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden, and it does well: it discloses ordering ('newest sets first'), a per-call request budget tied to max_items, cost semantics ('already-saved items cost nothing'), and quota rationale for the exclusion. It stops short of stating auth requirements or failure behavior, so 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then budget behavior, then the sibling alternative, then where to read output. Each sentence adds information, though the multi-line layout is slightly denser than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return format needn't be explained, and the description usefully points to library/<company>/index.md. However, for a 4-param tool with 0% schema coverage, leaving include_images and include_interviews unexplained is a real gap in an otherwise thorough definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and there are 4 params, so the description must compensate. It only explains max_items (live requests per call); include_images and include_interviews are never mentioned, and the 'cost nothing' note only loosely implies idempotent behavior. Two of four parameters remain fully undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Download') plus a specific resource ('one company's OAHelper content into the offline library') and enumerates the content types (set lists, question statements, MCQ answers, interview experiences). It also carves out what it does NOT do, routing the agent to the oahelper_solution sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the repeat-call pattern ('call it again to continue') and explains the exclusion condition for official solutions ('NOT fetched here because each one uses the account's daily solution quota; use oahelper_solution'). Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.0- First observed
oahelper_company - First observed
oahelper_interviews - First observed
oahelper_offline - First observed
oahelper_question - First observed
oahelper_search - First observed
oahelper_solution - First observed
oahelper_status - First observed
oahelper_sync
TDQS
Scored across 8 tools
Most tools target distinct actions (search companies, sync a company, read a question, fetch a solution, list interviews, inspect offline library, check status). The only mild overlap is oahelper_search vs oahelper_company, both of which locate sets, but their descriptions explicitly disambiguate name-based vs slug/URL-based lookup. The bulk-vs-single distinction between oahelper_sync and oahelper_question/solution is also spelled out.
All tools use a uniform oahelper_ snake_case prefix, which makes the set predictable and easy to scan. The only slight deviation is mixing action verbs (search, sync, offline) with domain nouns (company, question, solution, interviews, status), but formatting itself is consistent.
Eight tools is well-scoped for an OA interview-prep domain. Each tool earns its place: discovery, retrieval, bulk sync, offline inspection, and status each cover a distinct need without redundancy.
The surface covers the full lifecycle: find companies, inspect sets, sync content offline, read questions, fetch solutions, view interviews, and check offline/session state. Minor gaps remain, such as no direct standalone question-search or explicit login/auth tool, but status and search partially cover these.
Maintenance
Related MCP Connectors
MCP-native notes and memory for ChatGPT, Claude, and other AI tools.
Search your Glasp web and Kindle highlights, notes, and AI memories from any MCP client. Read-only.
Your saved videos, articles and notes as one knowledge base for Claude, ChatGPT and any MCP client.
- mcpOAuthai.butlerbrain
Persistent memory for AI assistants. Save once; recall from Claude, ChatGPT, or any MCP client.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to manage tasks and projects in TickTick/Dida365 via the MCP protocol, with OAuth authorization and read-only mode support.1566 npm4MIT
- AlicenseNot gradedqualityBmaintenanceEnables browsing your Coursera courses, viewing library maps and course outlines, and downloading transcripts and readings as text via MCP tools.5 npmMIT
- AlicenseNot gradedqualityCmaintenanceProvides tools for searching and reading Obsidian notes, creating flashcards, generating summaries, and planning study schedules via the MCP protocol.MIT
- AlicenseNot gradedqualityBmaintenanceRead-only MCP server for Chaoxing (å¦ä¹ 通) that logs into a user's account and exposes their class schedule, enrolled courses, course materials downloads, homework status, exam schedules and scores, chapter task-point progress, notices, and personal cloud drive files. Enables any MCP client to answer natural-language questions about a student's coursework without submitting anything or modifying account data.7MIT