raivatedu-mcp-server
RaivatEdu Education MCP Server
An unofficial, read-only Model Context Protocol (MCP) server that lets Claude Desktop (or any MCP client) explore the public RaivatEdu website — raivatedu.com — using natural language.
RaivatEdu is admissions & student-relationship software (a SaaS marketing site), not a course catalog. This server reflects what the site actually publishes: product/feature information, pricing by market, solutions by audience, resource articles, and contact details. It fetches only public marketing pages, honours robots.txt, and never touches private/authenticated areas.
Table of contents
Related MCP server: HitKeep
Verified website capability analysis
Inspected live on 2026-10-13 via robots.txt, /sitemap.xml (+ its three child sitemaps), raw HTML, and embedded JSON-LD.
Area | Finding | Verified? |
Purpose | Marketing site for RaivatEdu admissions/CRM software for schools, colleges, coaching & training | ✅ |
Rendering | Next.js, server-side prerendered ( | ✅ (Cheerio is enough; no headless browser needed) |
Structured data | Rich schema.org JSON-LD on every page: | ✅ |
Markets | 10 locales: | ✅ (markets.xml) |
Pages per market | home, pricing, enterprise, features (+9 detail), solutions (+4 detail), product, integrations, security, about, contact, demo, privacy, terms, resources, blog, guides, help; plus global | ✅ (sitemaps) |
Pricing | Published per market as JSON-LD offers (India: Starter ₹3,500 / Professional ₹4,500 / Enterprise ₹8,000 per user/month; 14-day trial) | ✅ |
Contact |
| ✅ |
Public API | None. | ✅ (so this server scrapes public HTML only, and never |
Course catalog / accounts / site search | Do not exist publicly. "Courses" (BBA, B.Tech, …) appear only as mock/sample data inside product screenshots | ✅ (so no |
Capability → tool mapping
Suggested tool | Decision | Reason |
| ✅ Implemented ( | Reachability via HEAD |
| ✅ | From JSON-LD |
| ✅ | Client-side search over known pages (no server API) |
| ✅ | Domain- & catalog-restricted |
| ✅ | From JSON-LD contact points |
| ❌ Omitted | No course catalog exists — implementing these would require fabricating data |
| ❌ Omitted | No course taxonomy; the real taxonomies are features & solutions (covered below) |
| ✅ as | "Resources" = admissions playbook articles |
— | ✅ | Pricing is a first-class, verified capability |
— | ✅ | Verified site taxonomies / navigation |
What this server exposes
10 tools, 4 resources (2 of them templated per market), and 4 prompts — all read-only.
Architecture
raivat-education-mcp/
├── src/
│ ├── index.ts # Entry point: stdio transport, CLI flags, graceful shutdown
│ ├── server.ts # Builds McpServer + context; wires tools/resources/prompts
│ ├── config.ts # Env config + the verified page/market/feature catalog
│ ├── context.ts # ServerContext (config + client + logger)
│ ├── tools/
│ │ ├── index.ts # registerAllTools
│ │ ├── shared.ts # response formatting, shared Zod fields, char limit
│ │ ├── website.ts # check_website_status, get_website_info, get_contact_information
│ │ ├── pages.ts # list_pages, get_page_content, search_content
│ │ ├── pricing.ts # get_pricing
│ │ └── catalog.ts # list_features, list_solutions, list_resources
│ ├── services/
│ │ ├── website-client.ts # SSRF-safe fetch: timeouts, retries, rate limiting
│ │ └── content-parser.ts # Cheerio + JSON-LD extraction (pricing/org/software/FAQ)
│ ├── resources/index.ts # raivatedu://info | contact | pages/{market} | pricing/{market}
│ ├── prompts/index.ts # find_relevant_plan, compare_plans, summarize_page, navigate_website
│ └── utils/
│ ├── url.ts # SSRF guard + catalog generation + path normalization
│ ├── errors.ts # Typed errors + MCP error-result builder
│ └── logger.ts # Leveled stderr-only logger
├── tests/ # Vitest unit + integration tests (+ optional live smoke)
├── .env.example
├── claude_desktop_config.example.json
├── eval/evaluation.xml # MCP evaluation questions
├── package.json / tsconfig.json / vitest.config.ts
├── README.md / LICENSEDesign highlights
stdio transport, logs on stderr only (stdout stays a clean JSON-RPC stream).
Structured output: every tool returns both human-readable text and
structuredContent(toggle withresponse_format: "json").JSON-LD first: pricing/org/contact come from the site's own machine-readable schema.org data, not brittle CSS selectors.
SSRF-hardened: outbound requests are restricted to
raivatedu.com/www.raivatedu.comover HTTPS and to the sitemap-derived page allowlist;/api/is always blocked.Polite client: per-request timeout, bounded retries with backoff, and a minimum interval between requests.
Prerequisites
Node.js ≥ 18 (fetch is built in; developed/tested on Node 22+). Download Node.js.
npm (bundled with Node).
Claude Desktop (latest) for the integration section — download.
Installation, build & run
# 1. Get the project (clone your fork, or copy this folder)
cd raivat-education-mcp
# 2. Install dependencies
npm install
# 3. Build TypeScript -> dist/
npm run build
# 4. (optional) configure — all vars are optional
cp .env.example .env
# 5. Run the server (stdio). It waits for an MCP client on stdin/stdout.
npm start
# or directly:
node dist/index.jsQuick sanity checks (do not speak MCP, just prove the binary works):
node dist/index.js --version # -> 1.0.0
node dist/index.js --helpDevelopment with auto-reload:
npm run devClaude Desktop integration
Install Node.js (see prerequisites) and note the absolute path to
node:macOS/Linux:
which nodeWindows (PowerShell):
(Get-Command node).Source
Build the project (
npm run build) sodist/index.jsexists.Find the absolute path to the built entry file:
macOS/Linux:
realpath dist/index.jsWindows (PowerShell):
(Resolve-Path dist\index.js).Path
Edit Claude Desktop's config file (
claude_desktop_config.json):macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonYou can open it from Claude Desktop → Settings → Developer → Edit Config.
Add this server under
mcpServers(seeclaude_desktop_config.example.json). Replace the example path with your own absolute path. On Windows, use double backslashes (\\).{ "mcpServers": { "raivat-education": { "command": "node", "args": ["/ABSOLUTE/PATH/TO/raivat-education-mcp/dist/index.js"], "env": { "RAIVATEDU_DEFAULT_MARKET": "in" } } } }Windows example
args:["C:\\Users\\you\\Desktop\\Raivat_MCP\\dist\\index.js"]Fully quit and reopen Claude Desktop (not just close the window).
Verify: open a new chat → click the tools/plug icon → you should see raivat-education with 10 tools. Ask: "Is the RaivatEdu website up?"
Tip: prefer
node+ absolutedist/index.jsovernpx/tsxfor reliability. Ensurenodeis on the PATH Claude Desktop sees, or use an absolute path to thenodebinary incommand.
MCP tool reference
All tools are read-only (readOnlyHint: true) and accept an optional response_format of "markdown" (default) or "json". Markets: in, us, gb, ca, au, nz, ie, sg, ae, za (default in, configurable).
raivatedu_check_website_status
Check reachability and response time (HTTP HEAD to a market home page).
Input:
market?,response_format?Output:
{ reachable, status, url, response_time_ms, checked_at }Example:
{ "market": "in" }→✅ reachable, HTTP 200, 180 ms
raivatedu_get_website_info
Product, organization and markets overview from JSON-LD.
Input:
market?,response_format?Output:
{ product{...}, organization{...}, markets[], source_url }
raivatedu_get_contact_information
Published contact emails + contact/demo page URLs (does not send anything).
Input:
market?,response_format?Output:
{ general_email, contact_points[], contact_page, demo_page }
raivatedu_get_pricing
Subscription plans & prices for a market, from pricing JSON-LD offers.
Input:
market?,response_format?Output:
{ market, currency, plans:[{ plan, billing, price, currency, unit, minUsers?, maxUsers?, url? }], source_url }Example (
in): Starter3500 INR, Professional4500 INR, Enterprise8000 INR, per user/month.
raivatedu_list_features
The 9 feature areas with URLs (optional live descriptions).
Input:
market?,include_descriptions?(default false),response_format?Output:
{ market, count, features:[{ slug, label, url, description? }] }
raivatedu_list_solutions
The 4 audience segments (Schools, Colleges & Universities, Coaching Institutes, Training & EdTech).
Input:
market?,include_descriptions?,response_format?Output:
{ market, count, solutions:[{ slug, label, url, description? }] }
raivatedu_list_resources
Resource articles + resources/blog/guides/help landing pages.
Input:
market?,include_descriptions?,response_format?Output:
{ market, landing_pages{...}, count, articles:[{ slug, label, url, description? }] }
raivatedu_list_pages
The site navigation map (verified page catalog) for a market.
Input:
market?,type?(e.g."feature","solution","resource-article"),response_format?Output:
{ market, count, pages:[{ path, url, type, market }] }
raivatedu_get_page_content
Fetch & summarize a specific public page (title, description, outline, body text, links, FAQ).
Input:
path(required, path or full raivatedu.com URL),max_text_chars?(200–20000, default 6000),include_links?(default true),response_format?Output:
{ url, type, title, description, canonical, headings[], text, faqs[], links[] }Errors: unknown path → "not a known public RaivatEdu page"; external host → refused (SSRF);
/api/*→ blocked.
raivatedu_search_content
Keyword search across ~28 content-rich pages for a market; ranked results with snippets.
Input:
query(required, 2–200 chars),market?,limit?(1–20, default 5),response_format?Output:
{ query, market, pages_searched, count, results:[{ title, url, type, score, snippet }] }Empty matches return
count: 0(not an error).
Resources & prompts
Resources (read-only, JSON):
raivatedu://info— product/org/markets overviewraivatedu://contact— contact detailsraivatedu://pages/{market}— page catalog (templated; lists all 10 markets)raivatedu://pricing/{market}— pricing plans (templated; lists all 10 markets)
Prompts:
find_relevant_plan— argsinstitution_type,team_size?,market?compare_plans— argmarket?summarize_page— argpathnavigate_website— argsgoal,market?
Environment variables
All optional; the server runs with zero config. See .env.example.
Variable | Default | Description |
|
| Market used when a tool call omits one. One of the 10 market codes. |
|
| Per-request timeout (1000–60000). |
|
| Minimum spacing between outbound requests (0–10000). |
|
| Retries for transient failures (0–5). |
| descriptive default | Override the outbound User-Agent. |
|
|
|
Testing
npm test # offline unit + integration tests (mocked HTTP) — 51 tests
npm run typecheck # tsc --noEmit
RUN_SMOKE=1 npm test # also runs optional live tests against raivatedu.comCoverage includes: config parsing, SSRF/path validation & catalog, HTML/JSON-LD parsing, the HTTP client (success, 404, 5xx retries, network errors, timeouts, host blocking), tool discovery, every tool's happy path, input validation, unknown-path & SSRF rejection, empty search results, and malformed-HTML/JSON-LD handling.
MCP Inspector
npm run build
npx @modelcontextprotocol/inspector node dist/index.js
# or: npm run inspectorThe Inspector opens a UI where you can list/call tools, read resources, and try prompts interactively.
Example conversations
Once connected in Claude Desktop you can ask:
"Is the RaivatEdu website up right now?" →
raivatedu_check_website_status"What is RaivatEdu and who makes it?" →
raivatedu_get_website_info"How much does RaivatEdu cost in India? Compare the plans." →
raivatedu_get_pricing(try thecompare_plansprompt)"I run a coaching institute with ~15 counsellors — which plan and solution fits?" →
find_relevant_plan→raivatedu_get_pricing+raivatedu_list_solutions"Where does the site talk about WhatsApp follow-ups?" →
raivatedu_search_content"Summarize the Admissions feature page." →
summarize_page→raivatedu_get_page_content"List all the resource articles and give me the one about migrating from spreadsheets." →
raivatedu_list_resources+raivatedu_get_page_content"What are RaivatEdu's sales and support email addresses?" →
raivatedu_get_contact_information"Show me the US pricing resource." → read resource
raivatedu://pricing/us
End-to-end verification checklist
npm installcompletes.npm run buildsucceeds;dist/index.jsexists.node dist/index.js --versionprints1.0.0.npm test→ all offline tests pass.RUN_SMOKE=1 npm test→ live tests pass (site reachable, INR pricing present).npx @modelcontextprotocol/inspector node dist/index.jslists 10 tools, 4 prompts, resources.In Inspector,
raivatedu_get_pricing {market:"in"}returns 3 INR plans.In Inspector,
raivatedu_get_page_content {path:"https://evil.example.com"}is refused.Claude Desktop config added with the correct absolute path; app fully restarted.
Tools icon shows raivat-education with 10 tools.
"Is the RaivatEdu website up?" triggers
raivatedu_check_website_statusand answers.
Security considerations
Read-only. No tool writes, submits forms, sends messages, or authenticates. Contact tools only surface already-public email addresses.
SSRF prevention. Outbound fetches are restricted to
raivatedu.com/www.raivatedu.comover HTTP(S), and only to paths in the verified sitemap-derived allowlist. Full URLs are parsed and host-checked; redirects are re-validated against the allowlist. Arbitrary/internal/external URLs are refused.robots.txt respected.
/api/is always blocked, matching the site'sDisallow: /api/.No access-control bypass. The server never attempts auth, CAPTCHAs, paywalls, or private areas.
Untrusted content. Page text is treated as data, not instructions (stated in the server instructions and the
summarize_pageprompt). Returned text is inert; nothing is executed.No secrets. No credentials, cookies, or tokens are used, stored, or logged. Logs go to stderr and contain only URLs/status/timing.
Polite. Timeouts, bounded retries with backoff, and a configurable minimum request interval protect the origin.
Input validation. All inputs validated with Zod (
.strict()where applicable) with length/range constraints.
Known limitations
Not a course catalog. RaivatEdu publishes no public courses, categories, user accounts, or search API, so there are intentionally no
list_courses/get_course_details/list_categoriestools. Course-like names on the site are sample data only.search_contentis client-side over ~28 curated pages per market — it is not a full-site crawl or a live search index.Scope = public marketing pages. The authenticated product (
app.raivatedu.com) and/api/are out of scope by design.Catalog is a snapshot. Page/feature/market lists were captured on 2026-10-13. If the site adds pages, update
src/config.ts(and the catalog count test). Tools degrade gracefully (404 → clear error) if a page is removed.include_descriptions: trueissues one request per item (slower); off by default.
Troubleshooting
Symptom | Fix |
Server not listed in Claude Desktop | Check |
"Server disconnected" / spawn error | Ensure |
Tools appear but every call errors with network messages | Check connectivity to |
"not a known public RaivatEdu page" | Use |
Garbled MCP / protocol errors | Something wrote to stdout. This server logs only to stderr — don't add |
Inspector can't connect | Rebuild first; run |
| They are in the test toolchain (vitest/esbuild). |
License
MIT — see LICENSE. Independent/unofficial; "RaivatEdu" marks belong to RaivatEdu Technologies Pvt. Ltd. Not affiliated or endorsed.
Available Tools
10 toolsraivatedu_check_website_statusCheck RaivatEdu Website StatusARead-onlyIdempotent
Check whether the RaivatEdu website (https://www.raivatedu.com) is reachable and how fast it responds.
Performs a single HTTP HEAD request to a market home page and reports the status code and round-trip time. Use this to confirm the site is up before running other tools, or to diagnose failures.
Args:
market (optional): locale to probe (in, us, gb, ca, au, nz, ie, sg, ae, za); defaults to the configured market.
response_format ('markdown' | 'json'): output format (default markdown).
Returns JSON shape: { "reachable": boolean, "status": number, "url": string, "response_time_ms": number, "checked_at": string }
| Name | Required | Description | Default |
|---|---|---|---|
| market | No | Market/locale segment. One of: in, us, gb, ca, au, nz, ie, sg, ae, za. Defaults to the server's configured market (initially 'in' for India). | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured object. | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and openWorld, so the safety profile is covered. The description adds real value beyond that by disclosing the mechanism (a single HTTP HEAD request, not a full page fetch), the reported metrics, and the exact response object. Minor ambiguity remains between 'the RaivatEdu website' and 'a market home page', and failure behavior (e.g., what status is returned when unreachable) is unspecified.
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, then usage guidance, then args and return shape — a sensible ordering. The Args block largely duplicates the schema, which is mild redundancy, but the sentence count stays tight.
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?
With no output schema present, the description correctly supplies the JSON return shape, including reachable/status/url/response_time_ms/checked_at, which the agent needs to interpret results. It is nearly complete; only error/unreachable semantics and pagination-irrelevant edge cases are left unstated.
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% and both parameters are enums with documented defaults, so the schema does the heavy lifting. The Args section restates the market enum and the default-configuration behavior without adding syntax or edge-case meaning beyond what the schema already says. Baseline 3 is appropriate.
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 ('Check whether ... is reachable and how fast it responds') with the exact target URL, and the HEAD-request detail pins down the mechanism. This is clearly distinguishable from siblings like raivatedu_get_website_info or raivatedu_get_page_content, which fetch content rather than probe liveness.
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 gives use contexts: 'confirm the site is up before running other tools, or to diagnose failures.' That is actionable guidance an agent can act on. It stops short of naming an explicit alternative or a when-not condition, so it is not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raivatedu_get_contact_informationGet RaivatEdu Contact InformationARead-onlyIdempotent
Retrieve RaivatEdu's publicly listed contact details: sales, support and security email addresses plus the contact and demo page URLs.
Email addresses come from the Organization JSON-LD contact points (the site's own machine-readable contact data). This tool does NOT submit forms or send messages — it only reads published contact details.
Args:
market (optional): locale used for the contact/demo page URLs (in, us, gb, ca, au, nz, ie, sg, ae, za); defaults to the configured market.
response_format ('markdown' | 'json'): output format (default markdown).
Returns JSON shape: { "general_email": string | null, "contact_points": [ { "type": string, "email": string | null, "telephone": string | null } ], "contact_page": string, "demo_page": string }
| Name | Required | Description | Default |
|---|---|---|---|
| market | No | Market/locale segment. One of: in, us, gb, ca, au, nz, ie, sg, ae, za. Defaults to the server's configured market (initially 'in' for India). | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured object. | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the safety profile is covered; the description adds real value by disclosing the data provenance (Organization JSON-LD contact points) and reiterating that no messages are sent. It does not discuss caching, freshness, or failure behavior when a contact point is absent, keeping 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?
Purpose and the key negative constraint are front-loaded in the first two sentences, with details following in a scannable Args/Returns layout. The Returns JSON block is somewhat verbose but compensates for the absence of an output schema, so it largely 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?
With no output schema, the description supplies the full return shape including nullable fields, and the only two parameters are fully documented. A caller has everything needed to invoke it correctly and interpret the response.
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% and both parameters already carry enum lists and default explanations in the schema. The description restates the market options and the response_format default without adding syntax or semantics beyond the structured fields, so 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?
States a specific verb and resource ('Retrieve RaivatEdu's publicly listed contact details') and enumerates exactly what is returned (sales, support, security emails plus contact/demo URLs). This is clearly distinguishable from siblings like get_website_info or list_pages without opening either 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?
Gives a clear context for use (reading published contact data) and an explicit when-not ('does NOT submit forms or send messages'), which prevents a plausible misuse. It does not name a sibling alternative for related lookups such as get_website_info, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raivatedu_get_page_contentGet RaivatEdu Page ContentARead-onlyIdempotent
Fetch and summarize the text of a specific public RaivatEdu page.
Accepts a path (e.g. "/in/pricing" or "in/features/admissions") or a full raivatedu.com URL. For safety the page MUST be one of the known public pages (use raivatedu_list_pages to discover them); arbitrary or external URLs are refused, and /api/ paths are blocked per robots.txt.
Returns the page title, meta description, heading outline, main body text (truncated), internal links, and any FAQ entries found in the page's structured data.
Args:
path (string, required): page path or full raivatedu.com URL.
max_text_chars (number): cap on returned body text, 200–20000 (default 6000).
include_links (boolean): include the list of internal links (default true).
response_format ('markdown' | 'json'): output format (default markdown).
Returns JSON shape: { "url": string, "type": string, "title": string, "description": string, "canonical": string | null, "headings": [ { "level": number, "text": string } ], "text": string, "faqs": [ { "question": string, "answer": string } ], "links": [ { "text": string, "url": string } ] }
Errors:
"not a known public RaivatEdu page" if the path is unknown — call raivatedu_list_pages.
"Page not found" (HTTP 404) if the page no longer exists.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Page path (e.g. "/in/pricing") or full raivatedu.com URL. | |
| include_links | No | Whether to include the page's internal links. | |
| max_text_chars | No | Maximum characters of body text to return (200–20000). | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured object. | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantive behavior beyond them: the whitelist enforcement, robots.txt blocking of /api/ paths, text truncation, and the specific error strings with the recommended recovery call. That is exactly the kind of constraint an agent needs before invoking.
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?
Well front-loaded: purpose, constraint, return contents, then parameters and errors in a predictable order. Slightly over-long because the Args block duplicates a schema that already has 100% description coverage, but the return-shape and error sections earn their space given there is no output schema.
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?
With no output schema available, the description supplies the full JSON return shape (url, title, headings, text, faqs, links) and documents the failure modes. For a read-only fetch tool with four parameters and enum output, nothing an agent needs to call it correctly is missing.
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 Args block is largely restatement under the baseline-3 rule. It does add real meaning in one place: distinguishing response_format 'markdown' as a human-readable summary versus 'json' as the full structured object, which clarifies the semantic difference the enum alone doesn't convey.
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 opens with a specific verb pair and resource: 'Fetch and summarize the text of a specific public RaivatEdu page,' and immediately narrows scope to known public pages. This distinguishes it from raivatedu_search_content (query-based) and raivatedu_list_pages (discovery), so an agent can route correctly without opening any 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?
It states the selection rule explicitly ('the page MUST be one of the known public pages'), names the discovery alternative (raivatedu_list_pages), and gives concrete exclusions (arbitrary/external URLs refused, /api/ blocked by robots.txt). The only minor omission is not naming raivatedu_search_content as the alternative for keyword lookup, but the when/when-not framing is otherwise complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raivatedu_get_pricingGet RaivatEdu PricingARead-onlyIdempotent
Retrieve RaivatEdu's subscription plans and prices for a given market.
Prices are read from the schema.org pricing Offers embedded in the market's /pricing page JSON-LD, so currency and amounts are exactly as published (e.g. India: Starter, Professional, Enterprise priced per user per month in INR). A 14-day free trial is offered on all plans.
Args:
market (optional): locale to price (in, us, gb, ca, au, nz, ie, sg, ae, za); defaults to the configured market. Each market prices in its local currency.
response_format ('markdown' | 'json'): output format (default markdown).
Returns JSON shape: { "market": string, "currency": string, "plans": [ { "plan", "billing", "price": number, "currency", "unit", "minUsers"?, "maxUsers"?, "url"? } ], "source_url": string }
Notes:
Amounts are numeric (e.g. 3500), not pre-formatted strings.
"Enterprise" typically has no maxUsers (open-ended) and may also be quoted via sales.
| Name | Required | Description | Default |
|---|---|---|---|
| market | No | Market/locale segment. One of: in, us, gb, ca, au, nz, ie, sg, ae, za. Defaults to the server's configured market (initially 'in' for India). | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured object. | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description goes further by disclosing provenance (schema.org Offers in the /pricing page JSON-LD), that amounts are numeric rather than pre-formatted, that each market prices in local currency, and that Enterprise is open-ended or sales-quoted. It stops short of saying anything about freshness/caching or failure modes when a market lacks a pricing page.
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?
Well front-loaded: purpose first, then source, then args, then return shape, then caveats. It is somewhat longer than needed because the enum list for market and the response_format explanation duplicate schema content that is already at 100% coverage.
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?
There is no output schema, yet the description supplies the complete JSON return shape including field names, optionality (minUsers/maxUsers/url) and type expectations (price as number). Combined with the numeric-amount and open-ended-Enterprise notes, an agent has everything needed to call and consume the result.
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 baseline is 3, but the description adds real meaning: the market parameter determines the currency and the plan set ('Each market prices in its local currency'), with a concrete example (India: Starter/Professional/Enterprise in INR). The response_format description largely restates the schema enum, so it is not uniformly additive.
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 opens with a specific verb and resource: 'Retrieve RaivatEdu's subscription plans and prices for a given market.' This is clearly distinct from the sibling listing tools (list_features, list_solutions, list_resources, get_page_content) — none of them return pricing, so an agent can route here without ambiguity.
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 establishes the selection context (price a specific market, with the configured market as the fallback) and explains where the data comes from, which tells the agent this is the authoritative pricing source rather than a generic page fetch. It does not state any when-not conditions or name an alternative for, say, sales-quoted enterprise pricing beyond a brief note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raivatedu_get_website_infoGet RaivatEdu Website InfoARead-onlyIdempotent
Return verified, high-level information about RaivatEdu: what the product is, the organization behind it, and which markets/currencies it serves.
Data is read from the schema.org JSON-LD (Organization + SoftwareApplication + WebSite) embedded in the site, so it reflects the site's own published description rather than any assumption.
Args:
market (optional): locale whose home page to read (in, us, gb, ca, au, nz, ie, sg, ae, za); defaults to the configured market.
response_format ('markdown' | 'json'): output format (default markdown).
Returns JSON shape: { "product": { "name", "description", "applicationCategory", "applicationSubCategory", "operatingSystem" }, "organization": { "name", "url", "email", "description", "logo" }, "markets": [ { "code", "name", "currency", "url" } ], "source_url": string }
| Name | Required | Description | Default |
|---|---|---|---|
| market | No | Market/locale segment. One of: in, us, gb, ca, au, nz, ie, sg, ae, za. Defaults to the server's configured market (initially 'in' for India). | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured object. | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered; the description earns credit on top by disclosing provenance — data comes from schema.org JSON-LD (Organization + SoftwareApplication + WebSite) embedded in the site and reflects published copy rather than assumptions. It does not cover failure modes for an openWorld fetch (site unreachable, missing JSON-LD), which is the main remaining gap.
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 purpose sentence is front-loaded and the document is organized into purpose, provenance, args, and returns, so a scanning agent finds what it needs quickly. The Args block is largely redundant with a fully documented schema, costing some density, though the Returns shape earns its space since no output schema exists.
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?
With no output schema, spelling out the returned JSON shape (product, organization, markets, source_url) is the right compensation and makes the tool's output predictable. What remains unaddressed is error behavior on a live-site fetch and whether a market override changes source_url — small but real gaps for an openWorld read.
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% and both parameters carry enums and defaults, so the schema already does the work. The description's Args section repeats the same locale list and defaults without adding syntax, interaction effects, or guidance on choosing a market, so 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?
States a specific verb ('Return') and a precisely enumerated resource: product identity, the organization behind it, and the markets/currencies served. That enumeration implicitly carves out scope against siblings such as get_pricing, list_features, and get_contact_information, so an agent can pick this for the overview call without opening another 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?
Usage is only implied: the 'high-level information' framing suggests this is the orientation call to make first, but there is no explicit statement of when to prefer it over get_contact_information or get_pricing, and no stated prerequisites or exclusions. An agent can infer intent but is not routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raivatedu_list_featuresList RaivatEdu FeaturesARead-onlyIdempotent
List the product feature areas RaivatEdu documents, each with its dedicated feature page URL.
The nine feature areas are fixed site sections (Fee management, Students & batches, Admissions, Enrolment & renewals, Attendance, Certificates, Communication, Reports, Platform & security). Use raivatedu_get_page_content on a returned URL for the full write-up of a feature.
Args:
market (optional): locale for the URLs (in, us, gb, ca, au, nz, ie, sg, ae, za); defaults to the configured market.
include_descriptions (boolean): fetch each feature page's summary (default false).
response_format ('markdown' | 'json'): output format (default markdown).
Returns JSON shape: { "market": string, "count": number, "features": [ { "slug", "label", "url", "description"? } ] }
| Name | Required | Description | Default |
|---|---|---|---|
| market | No | Market/locale segment. One of: in, us, gb, ca, au, nz, ie, sg, ae, za. Defaults to the server's configured market (initially 'in' for India). | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured object. | markdown |
| include_descriptions | No | If true, fetch each page live to include its meta description (slower, one request per item). If false (default), return only verified labels and URLs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), so the description's added value is the cost disclosure that include_descriptions triggers per-page live fetches, plus the full return shape. That is genuine behavioral context beyond the structured fields, though it doesn't address failure behavior when a page fetch fails.
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 one-line purpose and the fixed-section list, then Args and Returns in scannable blocks. No sentence is filler; even the parenthetical enumeration of the nine areas earns its place by setting agent expectations for the count.
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?
There is no output schema, and the description compensates by documenting the exact JSON shape including the optional description field. Combined with param semantics, sibling routing, and the fixed nine-item scope, an agent has everything needed to call and interpret this 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 description coverage is 100%, so all three parameters are already fully documented with enums and defaults. The description largely restates the schema ("market (optional): locale for the URLs", "include_descriptions (boolean)") with only marginal added meaning about what the locale affects.
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 the product feature areas RaivatEdu documents"), then enumerates all nine sections so the agent knows exactly what the result set contains. Calling them "fixed site sections" differentiates this from the generic page/solution/resource listing siblings without opening their 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?
Explicitly routes the agent onward: "Use raivatedu_get_page_content on a returned URL for the full write-up of a feature," which tells it this is an index tool, not a content-retrieval tool. It stops short of naming when-not-to-use or contrasting with raivatedu_list_pages / list_solutions / list_resources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raivatedu_list_pagesList RaivatEdu PagesARead-onlyIdempotent
List the public pages available on RaivatEdu for a market — a navigation map of the site.
Returns the verified set of pages (derived from the site's sitemap): home, pricing, enterprise, features (+ detail pages), solutions (+ detail pages), product, integrations, security, about, contact, demo, privacy, terms, resources, blog, guides, help, plus the global careers page. Feed any returned path to raivatedu_get_page_content.
Args:
market (optional): locale to list (in, us, gb, ca, au, nz, ie, sg, ae, za); defaults to the configured market.
type (optional): filter to one page category (e.g. "feature", "solution", "resource-article").
response_format ('markdown' | 'json'): output format (default markdown).
Returns JSON shape: { "market": string, "count": number, "pages": [ { "path", "url", "type", "market" } ] }
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Optional page category filter, e.g. 'feature', 'solution', 'resource-article', 'pricing'. | |
| market | No | Market/locale segment. One of: in, us, gb, ca, au, nz, ie, sg, ae, za. Defaults to the server's configured market (initially 'in' for India). | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured object. | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered. The description adds genuine behavioral context beyond that: the set is 'verified' and 'derived from the site's sitemap,' it enumerates the page categories actually returned, and it documents the response_format tradeoff (human-readable summary vs. full structured object).
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 purpose, then the category inventory, then Args, then return shape — a logical order with no filler sentences. The long enumeration of pages (home, pricing, enterprise, features...) is somewhat redundant with the documented return shape, but it does set agent expectations cheaply.
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?
No output schema exists, yet the description supplies the exact JSON shape ({market, count, pages:[{path,url,type,market}]}) and the markdown-vs-json behavior, plus zero required parameters and the default market are all clear. An agent can call this correctly and chain into raivatedu_get_page_content without further probing.
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 all three params including enums, defaults, and the 'configured market' fallback. The Args block in the description largely restates the schema, with only the example type values ('feature', 'solution', 'resource-article') adding marginal illustration that the schema also includes. 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?
States a specific verb and resource ('List the public pages available on RaivatEdu for a market') and frames the result as a 'navigation map of the site,' which distinguishes it from content-fetching siblings. It also names the natural follow-up tool, raivatedu_get_page_content, making the boundary between listing and retrieval explicit.
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?
Clear about context of use: this is the entry point for discovering paths, and 'Feed any returned path to raivatedu_get_page_content' gives explicit next-step routing. It stops short of exclusions — it never says whether to prefer raivatedu_list_features or raivatedu_list_solutions when only one category is wanted, despite those siblings existing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raivatedu_list_resourcesList RaivatEdu ResourcesARead-onlyIdempotent
List RaivatEdu's publicly available educational resource articles (admissions playbooks and guides), plus the resources, blog, guides and help landing pages.
The resource articles are practical pieces for education teams (e.g. first-response-time in admissions, WhatsApp templates, migrating from spreadsheets, admissions funnel metrics). Use raivatedu_get_page_content on a URL to read the full article text.
Args:
market (optional): locale for the URLs (in, us, gb, ca, au, nz, ie, sg, ae, za); defaults to the configured market.
include_descriptions (boolean): fetch each article's summary (default false).
response_format ('markdown' | 'json'): output format (default markdown).
Returns JSON shape: { "market": string, "landing_pages": { "resources", "blog", "guides", "help" }, "count": number, "articles": [ { "slug", "label", "url", "description"? } ] }
| Name | Required | Description | Default |
|---|---|---|---|
| market | No | Market/locale segment. One of: in, us, gb, ca, au, nz, ie, sg, ae, za. Defaults to the server's configured market (initially 'in' for India). | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured object. | markdown |
| include_descriptions | No | If true, fetch each page live to include its meta description (slower, one request per item). If false (default), return only verified labels and URLs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description's one real behavioral disclosure is that include_descriptions triggers live per-item fetching and is slower — but that is already spelled out in the schema. Nothing is said about failure modes or what happens for a market with no articles.
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?
Well front-loaded: the purpose and the follow-up tool come first, then Args, then Returns. The Args section largely duplicates a fully-covered schema, so it costs a few lines that do not earn their place, but the overall structure is scannable and not padded.
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?
There is no output schema, and the description compensates by giving the exact JSON return shape (market, landing_pages, count, articles with optional description), which is what an agent needs to plan a follow-up call. It does not mention pagination or whether the article list is complete, but for a small static catalogue that is a minor gap.
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% and all three parameters are fully documented with enums and defaults, so the baseline is 3. The description's Args block restates the same defaults (market falls back to the configured market, include_descriptions default false) without adding syntax or constraint detail 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?
States a specific verb and resource (list RaivatEdu's publicly available educational resource articles) and enumerates the two things returned: article catalogue plus the resources/blog/guides/help landing pages. It distinguishes itself from the retrieval sibling by naming raivatedu_get_page_content as the way to read article bodies.
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 gives the follow-up route: "Use raivatedu_get_page_content on a URL to read the full article text," which makes the list-then-fetch pattern unambiguous. It does not, however, contrast with raivatedu_list_pages or raivatedu_search_content, so the agent must infer when this catalogue listing beats those siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raivatedu_list_solutionsList RaivatEdu SolutionsARead-onlyIdempotent
List the audience/solution segments RaivatEdu targets, each with its dedicated page URL.
The four segments are Schools, Colleges & Universities, Coaching Institutes, and Training & EdTech. Use raivatedu_get_page_content on a returned URL for the full pitch tailored to that segment.
Args:
market (optional): locale for the URLs (in, us, gb, ca, au, nz, ie, sg, ae, za); defaults to the configured market.
include_descriptions (boolean): fetch each solution page's summary (default false).
response_format ('markdown' | 'json'): output format (default markdown).
Returns JSON shape: { "market": string, "count": number, "solutions": [ { "slug", "label", "url", "description"? } ] }
| Name | Required | Description | Default |
|---|---|---|---|
| market | No | Market/locale segment. One of: in, us, gb, ca, au, nz, ie, sg, ae, za. Defaults to the server's configured market (initially 'in' for India). | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured object. | markdown |
| include_descriptions | No | If true, fetch each page live to include its meta description (slower, one request per item). If false (default), return only verified labels and URLs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world. The description adds non-obvious cost information: include_descriptions triggers one live HTTP request per item and is slower, versus returning only verified labels and URLs by default. It could say more about failure behavior when a live fetch fails, but the cost disclosure is genuinely useful.
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 purpose, then segment enumeration, then the follow-up tool, then params and return shape. The Args and Returns sections duplicate structured data, which is mild waste, but the overall ordering and length remain easy to scan.
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?
With no output schema present, the description supplies the exact JSON return shape including field names and the optional description field. Combined with the segment list and follow-up routing, an agent has everything needed to call and consume this tool 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% and the enumerated market values, defaults, and format options are already documented in the schema. The description's Args block largely restates them ('defaults to the configured market', 'default false', 'default markdown') without adding new semantics such as URL pattern per market. 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?
States a specific verb and resource ('List the audience/solution segments RaivatEdu targets') and immediately enumerates the four segments, so the agent knows exactly what comes back. This is clearly differentiated from sibling listing tools like list_pages and list_features by naming the resource domain (audience segments).
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 routes the agent forward: use raivatedu_get_page_content on a returned URL for segment-specific pitch content, and explains when to set include_descriptions (only when summaries are needed). It does not state when to prefer raivatedu_list_pages instead for general page discovery, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raivatedu_search_contentSearch RaivatEdu ContentARead-onlyIdempotent
Search the public RaivatEdu website for a keyword or phrase and return the most relevant pages with matching snippets.
There is no public search API on the site, so this tool performs a client-side search: it fetches a curated set of content-rich pages for the market, scores them against your query (title, headings, description and body), and returns the best matches. Use it to answer "where does the site talk about X?" questions, then drill in with raivatedu_get_page_content.
Args:
query (string, required): 2–200 chars; words are matched case-insensitively.
market (optional): locale to search (in, us, gb, ca, au, nz, ie, sg, ae, za); defaults to the configured market.
limit (number): max results, 1–20 (default 5).
response_format ('markdown' | 'json'): output format (default markdown).
Returns JSON shape: { "query": string, "market": string, "pages_searched": number, "count": number, "results": [ { "title", "url", "type", "score": number, "snippet": string } ] }
Notes:
Searches ~28 marketing/content pages per market; it does not crawl the entire site.
Returns an empty results array (not an error) when nothing matches.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (1–20). | |
| query | Yes | Keyword or phrase to search for. | |
| market | No | Market/locale segment. One of: in, us, gb, ca, au, nz, ie, sg, ae, za. Defaults to the server's configured market (initially 'in' for India). | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured object. | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/idempotent/non-destructive, and the description adds substantial beyond that: no public search API exists, it is a client-side fetch over ~28 curated pages rather than a full crawl, and no-match returns an empty array instead of an error. These are exactly the operational caveats an agent needs.
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 purpose and mechanism, then args, returns and notes in a scannable order. The args section largely restates the schema, which is mild redundancy, but the returns block earns its space since there is no output schema.
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?
With no output schema, the description supplies the full return shape, including score and snippet fields, plus the empty-results behavior and the bounded crawl scope. Nothing an agent needs to call and interpret this tool is missing.
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 baseline is 3; the description adds a genuinely new semantic detail in that words are matched case-insensitively and the search spans title, headings, description and body. The remaining arg listings duplicate the schema, so it does not earn a 5.
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 ('Search the public RaivatEdu website') plus what is returned ('most relevant pages with matching snippets'). It also distinguishes itself from raivatedu_get_page_content by framing this as the discovery step before drilling in.
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 names the use case ('where does the site talk about X?') and names the follow-up tool raivatedu_get_page_content, so an agent knows both when to use it and what to do next. The alternative for full page text is effectively routed to the sibling.
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.
10 tool updates
v1.0.0- First observed
raivatedu_check_website_status - First observed
raivatedu_get_contact_information - First observed
raivatedu_get_page_content - First observed
raivatedu_get_pricing - First observed
raivatedu_get_website_info - First observed
raivatedu_list_features - First observed
raivatedu_list_pages - First observed
raivatedu_list_resources - First observed
raivatedu_list_solutions - First observed
raivatedu_search_content
TDQS
Scored across 10 tools
Each tool targets a distinct slice of data (status, org info, contact, page content, search, pricing, and three curated listings), so misselection risk is low. The only overlap is between raivatedu_list_pages and the specialized list_features/list_solutions/list_resources tools, which enumerate the same underlying pages but with curated metadata; the descriptions make the difference clear enough.
Every tool uses the same raivatedu_ prefix plus a consistent snake_case verb_noun pattern (check_, get_, list_, search_). The verb choice matches the operation type, making the surface fully predictable.
Ten tools is well within the sweet spot, and each covers a distinct read-only capability without redundancy. Nothing feels padded or missing for a site-content server.
The surface covers the full read-only lifecycle: health check, org info, contact, navigation, page fetch, search, pricing, and curated feature/solution/resource listings, with sensible guardrails (known-pages only, robots.txt). Minor gaps remain, such as no cross-market pricing or careers-page specific access, but these are workable via raivatedu_get_page_content.
Maintenance
Related MCP Connectors
Read-only MCP server for Flamel.ai's public content: company overview, blog, case studies, FAQs.
Read-only MCP access to devplane.dev's public pages, FAQ corpus and comparisons.
Read-only MCP server for The Automators: services, pricing, industries, case studies, calculators.
Public read-only MCP for products, frameworks, guides, methodology, and blog metadata.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceMCP server for Context Studio, a file-based CMS for governed marketing documents and searchable collections, enabling retrieval and management of AI context via tools like scopes, document reads, and collection search.3-
- AlicenseAqualityAmaintenanceRead-only MCP server for aggregate HitKeep analytics and official documentation, including traffic, events, goals, funnels, ecommerce, Search Console, and AI visibility reporting.1698MIT
- AlicenseNot gradedqualityDmaintenanceRead-only MCP server for accessing GitBook content, including spaces, pages, and search, through AI assistants.22 npmMIT
- AlicenseNot gradedqualityDmaintenancePublic, read-only MCP server exposing structured metadata about the Makuri EdTech platform, including tools for platform info, languages, subjects, pricing, safety, compliance, tech stack, contact, free resources, and interactive panels. Designed for AI assistants to query platform details without accessing user data.MIT