Skip to content
TestWebMCP

WebMCP report

www.meritplan.rs

https://www.meritplan.rs/

35/ 100
Grade E

9 tool(s) registered on navigator.modelContext, a name Chrome doesn't support, so visitors can't use them. Changing it to document.modelContext fixes this.

Registers on navigator.modelContext onlyScanned 9/25/2026, 6:17:40 PM · 49046ms
Registration
5/60
Tool quality
5/15
Ready for visitors
25/25

Registered tools

search_postsnavigator.modelContextregisterTool · 10114ms

Search posts, pages or custom post types on the site.

inputSchema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "query": {
      "type": "string",
      "description": "Search keywords."
    },
    "per_page": {
      "type": "integer",
      "description": "Results per page (default: 5, max: 20)."
    },
    "post_type": {
      "type": "string",
      "description": "Post type slug (default: any)."
    }
  }
}
get_postnavigator.modelContextregisterTool · 10114ms

Retrieve a single post or page by ID or slug.

inputSchema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "description": "Post ID."
    },
    "slug": {
      "type": "string",
      "description": "Post slug."
    }
  }
}
get_menunavigator.modelContextregisterTool · 10114ms

Return the items of a navigation menu.

inputSchema
{
  "type": "object",
  "properties": {
    "menu": {
      "type": "string",
      "description": "Menu name, slug, or ID (default: primary)."
    }
  }
}
submit_contact_formnavigator.modelContextregisterTool · 10114ms

Submit a Contact Form 7 form programmatically.

inputSchema
{
  "type": "object",
  "required": [
    "form_id",
    "fields"
  ],
  "properties": {
    "fields": {
      "type": "object",
      "description": "Key-value pairs matching the form field names."
    },
    "form_id": {
      "type": "integer",
      "description": "CF7 form post ID."
    }
  }
}
get_site_infonavigator.modelContextregisterTool · 10114ms

Return basic site metadata (name, description, URL, language).

inputSchema
{
  "type": "object",
  "properties": []
}
get_categoriesnavigator.modelContextregisterTool · 10114ms

List all post categories with their slugs and counts.

inputSchema
{
  "type": "object",
  "properties": {
    "taxonomy": {
      "type": "string",
      "description": "Taxonomy slug (default: category)."
    }
  }
}
get_markdown_contentnavigator.modelContextregisterTool · 10114ms

Retrieve a published post or page as clean Markdown — ideal for AI consumption. Requires Mescio for Agents.

inputSchema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "description": "Post ID."
    },
    "slug": {
      "type": "string",
      "description": "Post slug."
    }
  }
}
get_llms_txtnavigator.modelContextregisterTool · 10114ms

Return the structured llms.txt context for the whole site — lets agents understand what the site is about at a glance. Requires Mescio for Agents.

inputSchema
{
  "type": "object",
  "properties": {
    "variant": {
      "type": "string",
      "description": "\"index\" for the summary (default) or \"full\" for the complete content."
    }
  }
}
retrievenavigator.modelContextregisterTool · 10114ms

RAG retrieve: search published site content and return ranked hits with snippets, Markdown URLs and token estimates. Use this before get_markdown_content. Requires Mescio for Agents.

inputSchema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "query": {
      "type": "string",
      "description": "Natural-language or keyword query."
    },
    "per_page": {
      "type": "integer",
      "description": "Hits to return (default: 5, max: 10)."
    },
    "post_type": {
      "type": "string",
      "description": "Optional post type slug (post, page, product, …)."
    },
    "include_content": {
      "type": "boolean",
      "description": "If true, attach truncated Markdown for each hit (default: false)."
    }
  }
}

Registration

5/60
Partial

Tools registered with JavaScript R1

5/20

9 tool(s) registered on navigator.modelContext. Chrome doesn't support that name, so visitors can't use them.

navigator.modelContext is an old name from early drafts of WebMCP. Chrome only supports document.modelContext.

Fix: Change navigator to document. Nothing else needs to change.

- navigator.modelContext.registerTool(tool);
+ document.modelContext.registerTool(tool);
  • Tools: search_posts, get_post, get_menu, submit_contact_form, get_site_info, get_categories, get_markdown_content, get_llms_txt, retrieve
Fail

Tools registered through forms R2

0/5

No form tools, and no tools registered with JavaScript.

The quickest way to add a tool is to give a form you already have a toolname attribute. No JavaScript needed.

Fix: Add toolname and tooldescription to an existing form.

<form toolname="search_products"
      tooldescription="Search the product catalogue. Use when the user wants to find a product."
      action="/search" method="get">
  <input name="query" type="text" required>
  <button type="submit">Search</button>
</form>
Fail

Tools work when called R3

0/30

We couldn't test any tools. Skipped 9: search_posts (it's registered on navigator.modelContext, which Chrome doesn't provide); get_post (it's registered on navigator.modelContext, which Chrome doesn't provide); get_menu (it's registered on navigator.modelContext, which Chrome doesn't provide); submit_contact_form (it's registered on navigator.modelContext, which Chrome doesn't provide); get_site_info (it's registered on navigator.modelContext, which Chrome doesn't provide); get_categories (it's registered on navigator.modelContext, which Chrome doesn't provide); get_markdown_content (it's registered on navigator.modelContext, which Chrome doesn't provide); get_llms_txt (it's registered on navigator.modelContext, which Chrome doesn't provide); retrieve (it's registered on navigator.modelContext, which Chrome doesn't provide)

We only call tools that just read information, so a scan never changes anything on your site. We need at least one of those to check that your tools work.

Fix: Mark tools that only read information with readOnlyHint: true, so we can test them.

annotations: { readOnlyHint: true }   // only reads, safe to call
Fail

Tools registered within 5 seconds R4

0/5

Tools were only registered on navigator.modelContext, which Chrome doesn't support.

Agents look for tools right after the page loads. Tools that show up late can be missed.

Fix: Register tools when the page loads, not after a click or inside a slow script.

if (document.readyState === "loading") {
  document.addEventListener("DOMContentLoaded", registerTools, { once: true });
} else {
  registerTools();
}

Tool quality

5/15
Fail

Valid input schemas Q1

0/5

1 of 9 tool(s) have schema problems: • get_site_info: not valid JSON Schema. schema is invalid: data/properties must be object

Agents read the schema to know what to send. A type and a short description on each field help them send the right thing.

Fix: Give every field a type and a short description.

inputSchema: {
  type: "object",
  properties: {
    query: { type: "string",  description: "What to search for" },
    limit: { type: "integer", description: "How many results to return (default 10)" }
  },
  required: ["query"]
}
  • search_posts: 3 field(s), all described.
  • get_post: 2 field(s), all described.
  • get_menu: 1 field(s), all described.
  • submit_contact_form: 2 field(s), all described.
  • get_categories: 1 field(s), all described.
  • get_markdown_content: 2 field(s), all described.
  • get_llms_txt: 1 field(s), all described.
  • retrieve: 4 field(s), all described.
Pass

Clear descriptions Q2

3/3

All 9 tool(s) have a description.

  • search_posts: "Search posts, pages or custom post types on the site."
  • get_post: "Retrieve a single post or page by ID or slug."
  • get_menu: "Return the items of a navigation menu."
  • submit_contact_form: "Submit a Contact Form 7 form programmatically."
  • get_site_info: "Return basic site metadata (name, description, URL, language)."
  • get_categories: "List all post categories with their slugs and counts."
  • get_markdown_content: "Retrieve a published post or page as clean Markdown — ideal for AI consumption. Requires Mescio for Agents."
  • get_llms_txt: "Return the structured llms.txt context for the whole site — lets agents understand what the site is about at a glance. R… (146 chars total)"
  • retrieve: "RAG retrieve: search published site content and return ranked hits with snippets, Markdown URLs and token estimates. Use… (182 chars total)"
Pass

Clear names Q3

2/2

All 9 tool name(s) are specific.

  • Names: search_posts, get_post, get_menu, submit_contact_form, get_site_info, get_categories, get_markdown_content, get_llms_txt, retrieve
Fail

Read-only hints Q4

0/3

9 of 9 tool(s) don't say whether they change anything: • search_posts: readOnlyHint isn't set. • get_post: readOnlyHint isn't set. • get_menu: readOnlyHint isn't set. • submit_contact_form: readOnlyHint isn't set. • get_site_info: readOnlyHint isn't set. • get_categories: readOnlyHint isn't set. • get_markdown_content: readOnlyHint isn't set. • get_llms_txt: readOnlyHint isn't set. • retrieve: readOnlyHint isn't set.

readOnlyHint tells agents whether a tool only reads information or changes something. Agents can use read-only tools freely and check with the user before the rest.

Fix: Set readOnlyHint on every tool: true if it only reads, false if it changes something.

annotations: {
  readOnlyHint: true,
  untrustedContentHint: true   // optional: results include text from users or other sites
}
Not assessed

Result size Q5

0/2

No tool returned a result, so this wasn't checked.

Fix: Get a tool returning results first (see R3).

Ready for visitors

25/25
Pass

HTTPS with a valid certificate P1

5/5

The page uses HTTPS with a valid certificate.

  • Connected to www.meritplan.rs over HTTPS.
  • Issuer: Let's Encrypt
  • Valid until: Nov 14 12:38:48 2026 GMT
Pass

Origin trial token P2

15/15

Found an origin trial token in a meta tag, so Chrome turns WebMCP on for your visitors.

  • Token: A7vZI3v+Gz7JfuRolKNM4Aff6zaGuT7X0mf3wtoZTnKv6497cVMnhy03KDqX… (292 chars total)
Pass

No errors blocking tools P3

5/5

No errors stopped your tools from registering.

  • No Content-Security-Policy header.

Scan details

Requested
https://www.meritplan.rs/
Final URL
https://www.meritplan.rs/
HTTP status
200
Page title
Merit Plan | Ljudski resursi i organizacioni razvoj
Load time
8984ms
Total scan time
49046ms
User agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36