Reach120 MCP Server
OfficialClick 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., "@Reach120 MCP ServerCan you show me a TOEFL writing prompt?"
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.
Reach120 MCP server
An MCP server that gives an AI agent a governed path to the Reach120 TOEFL iBT practice API: fetch Writing practice prompts, and score a learner's written response.
Reach120 is an independent practice platform. It is not affiliated with, endorsed by, or administered by ETS. TOEFL® is a registered trademark of ETS. Reach120 is not affiliated with, endorsed by, or approved by ETS.
Tools
Tool | What it does | Cost |
| List Writing practice prompts, with the id used to score against one | Reads stored rows, runs no model |
| Fetch one prompt with its full scenario or discussion context | Reads a stored row, runs no model |
| Score a written response, returning an automated practice score and a short rationale | Runs the scorer; metered against your key |
Related MCP server: agent-validator-mcp-server
You bring the key
This server carries no credential. It forwards the key you place in
REACH120_API_KEY and returns the API's answer unchanged.
That is a design decision, not an omission. Every limit that matters lives on the server side of the API and is evaluated on every call — a per-key request window, a per-key daily scoring allowance, and a service-wide spending gate. A client that enforced its own limits would only be enforcing them on people who chose to keep using the client, so this one enforces none and cannot be a way around any of them. Delete this package and call the endpoint directly and you get identical refusals.
There is no unauthenticated scoring path. An agent with no key receives a refusal naming where a key comes from, and nothing is sent.
Request a key and read the full limit, error-code and version policy at https://www.reach120.com/developers.
Install
This package is not published on npm. The install path is this repository, and
it is the only one — @reach120/mcp-server does not resolve on the public npm
registry and no other package name stands in for it.
npx -y github:reach120/reach120-mcpnpm compiles the TypeScript during that install through the prepare script, so
there is no separate build step.
Or clone it and run it from source:
git clone https://github.com/reach120/reach120-mcp.git
cd reach120-mcp
npm install
npm run build
node dist/index.jsConfigure
Claude Desktop (claude_desktop_config.json), Claude Code, or any MCP client that
speaks stdio:
{
"mcpServers": {
"reach120": {
"command": "npx",
"args": ["-y", "github:reach120/reach120-mcp"],
"env": {
"REACH120_API_KEY": "r120_live_your_key_here"
}
}
}
}Variable | Required | Default | Meaning |
| yes | — | Your Reach120 API key. Tools refuse without it. |
| no |
| Point at another deployment. |
| no | see | Per-request timeout, in milliseconds. |
What a refusal looks like
Limits refuse with a machine-readable code rather than degrading. A call that hits
the key's daily allowance is not quietly scored on a cheaper engine and handed back
as if it were the engine you asked for — the code names what happened, and the
error table on /developers says what each one means.
Verify it locally
npm install
npm run build
npm run verifynpm run verify starts the built server over stdio, completes a real MCP
handshake with the SDK client, prints the advertised tools, and calls one tool
without a key to show the refusal path.
Scores are practice feedback
score_writing_response returns automated practice feedback produced by Reach120.
It is not an ETS score and is not reported on the official scale. This README deliberately does not name the scale the number is on: that fact is published beside a mandatory limitation the claims ledger requires, which a package page cannot render. The response shape is documented on https://www.reach120.com/developers.
TOEFL® is a registered trademark of ETS. Reach120 is not affiliated with, endorsed by, or approved by ETS.
Licence
MIT. See LICENSE.
Available Tools
3 toolsget_practice_promptFetch one TOEFL Writing practice promptARead-only
Fetch a single Writing practice prompt by its id, including the full scenario or discussion context a learner is asked to respond to. Reads a stored row and runs no model. TOEFL® is a registered trademark of ETS. Reach120 is not affiliated with, endorsed by, or approved by ETS.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes | The prompt id returned by list_practice_prompts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds that the tool 'Reads a stored row and runs no model,' which clarifies that no AI generation happens and the result is deterministic. This is useful context beyond the annotations, and it does not contradict them.
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?
The functional description is just two sentences, front-loading the main action and expected result. The trademark disclaimer is extra but legally necessary and does not bloat the description. Every sentence earns its place.
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 single-parameter fetch tool with no output schema, the description adequately conveys what the caller gets (the full scenario/discussion context) and that it is a read-only database lookup. Nothing vital is missing for correct invocation.
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 schema fully documents item_id, including its meaning ('The prompt id returned by list_practice_prompts') and constraints (minLength 1). The description adds no further parameter information, so the baseline 3 applies given the 100% schema coverage.
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 clearly states the action ('Fetch a single Writing practice prompt by its id') and the resource, and specifies it includes the full scenario or discussion context. The use of 'single' and 'by its id' distinguishes it from sibling list_practice_prompts, and 'runs no model' contrasts with score_writing_response.
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 implies usage: the caller needs an id to fetch a specific prompt, which is a clear precondition. However, it does not explicitly point to list_practice_prompts for obtaining the id, nor does it state when to prefer this over alternatives. The parameter description in the schema partially compensates, so this is not a complete miss.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_practice_promptsList TOEFL Writing practice promptsARead-only
List Writing practice prompts from the Reach120 bank — the Write an Email task and the Writing for an Academic Discussion task. Returns each prompt with the id you pass to score_writing_response. Reads stored rows and runs no model, so it spends nothing against your daily scoring allowance, but it does count against your per-minute request window. TOEFL® is a registered trademark of ETS. Reach120 is not affiliated with, endorsed by, or approved by ETS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many prompts to return. | |
| offset | No | How many prompts to skip, for paging. | |
| task_type | No | Restrict to one Writing task type. Omit to receive both. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds beyond that: it runs no model, spends nothing against the daily scoring allowance, and counts against the per-minute request window. This gives the agent information about side effects and rate-limit behavior not captured in annotations. No contradictions.
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?
The description is moderately sized and information-dense. The core purpose is front-loaded, followed by cost and rate-limit details, and then a legal disclaimer. The legal section is less functional but not excessive; the structure is logical and every sentence carries relevant information except the trademark boilerplate.
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?
Given three well-documented parameters, no output schema, and straightforward behavior, the description provides all needed context: what is returned (prompts with ids), which task types, cost implications, and rate-limit behavior. An agent can invoke this tool correctly without ambiguity.
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 100%, so all three parameters are documented with meaning in the schema. The description does not add extra semantics for the parameters beyond what the schema already provides, only reiterates the task_type omission behavior which is already in the schema. Baseline 3 applies.
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 verb ('List') and resource ('Writing practice prompts from the Reach120 bank'), and enumerates the two task types covered. It also hints at the primary use case by mentioning the id that is passed to score_writing_response, which distinguishes it from siblings. Purpose is unambiguous and differentiates from get_practice_prompt and score_writing_response.
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?
It gives clear context for when to use: it returns prompts with the id needed for scoring, and it explains cost implications (no scoring allowance usage, but counts against request window). However, it does not explicitly state when NOT to use it or mention alternatives by name, though the sibling list exists. The guidance is sufficient for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
score_writing_responseScore a TOEFL Writing responseA
Score a learner's written response to a TOEFL iBT Writing task and return an automated practice score with a short rationale. The response shape, the limits and the error codes are documented at https://www.reach120.com/developers. Supply either item_id from the prompt tools, or task_type plus the prompt inline for your own coursework. This call runs an AI scorer and is metered: it draws on the daily spend ceiling attached to your API key, and refuses with a machine-readable code rather than quietly scoring on a cheaper engine when a limit is reached. Reach120 is an independent practice platform. It is not affiliated with, endorsed by, or administered by ETS. TOEFL® is a registered trademark of ETS. Reach120 is not affiliated with, endorsed by, or approved by ETS.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | No | The prompt, inline. Ignored when item_id is supplied. | |
| item_id | No | A prompt id from the prompt tools. Supply this or task_type + prompt. | |
| response | Yes | The learner's written response. At most 6000 characters. | |
| task_type | No | Required when you supply the prompt inline instead of an item_id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that the call is a metered AI scorer drawing on the daily spend ceiling and that it refuses with a machine-readable code rather than silently falling back to a cheaper engine. It also includes the ETS non-affiliation disclaimer, all of which is useful behavioral context not present in the annotations.
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?
The description is front-loaded with purpose and usage, then adds behavioral and legal context. It is slightly longer than necessary due to repeated ETS disclaimer phrasing, but every major section earns its place.
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?
Given no output schema, the description still covers the return value, the metering behavior, the spend limit refusal, the parameter selection rule, and where to find response shapes and error codes. For a tool of this complexity, it is complete enough for an agent to invoke it correctly.
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 100%, so the schema already documents each parameter. The description adds meaningful selection semantics by explaining the either/or relationship between item_id and task_type plus prompt, and clarifies that prompt is only for inline coursework. This goes beyond the schema baseline.
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 verb and resource: score a learner's written response to a TOEFL iBT Writing task and return an automated practice score with a rationale. This clearly differentiates it from the sibling prompt-list and prompt-retrieval tools.
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?
It explicitly tells the agent how to choose between item_id and task_type plus inline prompt, and references the prompt tools as the source of item_id. This gives a clear selection rule without leaving the agent to infer the param relationship.
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.
3 tool updates
v0.1.0- First observed
get_practice_prompt - First observed
list_practice_prompts - First observed
score_writing_response
TDQS
Scored across 3 tools
Each tool has a clear, distinct role: listing prompts, fetching a single prompt by id, and scoring a written response. The list/get pair follows a standard convention without meaningful overlap, and scoring is wholly separate.
All tool names follow a consistent verb_noun snake_case pattern: list_practice_prompts, get_practice_prompt, score_writing_response. The naming clearly communicates both the action and the target resource.
Three tools is well-scoped for this server's narrow purpose: browsing a fixed prompt bank and scoring responses. Each tool serves a distinct step in the workflow without redundancy.
The tool surface covers the full intended workflow: discover prompts, retrieve full prompt details, and score a response using either a bank item or inline task type. Since the prompt bank is read-only, no create/update/delete tools are necessary.
Maintenance
Related MCP Connectors
Turn any task into the right API calls: discover, evaluate, and integrate public APIs.
Discover, inspect and run 63,000+ agent tools from one balance. Pay per call, no subscriptions.
Give your agent live data from Twitter, Reddit, the web and GitHub. No API keys, no scraping stack.
Verified, pay-per-use API tools for AI agents through one authenticated connection.
Related MCP Servers
AlicenseNot gradedqualityDmaintenanceEnables LLMs to convert documents to Google Forms, edit questions, list and publish forms, and run AI form assistant tools through the Formswrite API.MIT- AlicenseAqualityDmaintenanceEnables testing and validation of APIs for AI agent compatibility, providing scores, grades, and actionable recommendations.3MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to discover, search, and call any REST API described by an OpenAPI or Swagger document. Supports multiple API endpoints with authentication and parameter handling.6 npmMIT
- FlicenseAqualityCmaintenanceEnables AI agents to create and edit Google Docs and draft Gmail emails through natural language.7-