Koskamo

AIReady MCP

AIReady provides MCP tools to scan and fix a website's AI discoverability. It checks AI crawler access via robots.txt, verifies llms.txt and sitemap presence, audits schema.org structured data, and generates fixes like AI-specific robots.txt rules, starter llms.txt files, and JSON-LD snippets to help AI assistants find, read, and cite the site.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

AIReady MCP logo, by MagicTeamsCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by MagicTeams
MCP endpoint (Streamable HTTP)
https://ai-ready.magicteams.ai/mcp
Vendor documentation

What its tools do

5 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

5 of 5 have a description · 5 of 5 declare behavior hints · 4 of 4 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Scan a website's AI search visibility and crawler access
  • Generate robots.txt rules for AI crawlers
  • Draft a starter llms.txt file
  • Generate schema.org JSON-LD snippets

Source and maintenance

Community listingRegistry 1.0.0
Maintenance checked

Protocol and capabilities

Server
ai-ready 1.2.0
MCP protocol negotiated in check
2025-11-25
Tools
5 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
3 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

AIReady checks and fixes how visible a website is to AI assistants and AI search (ChatGPT, Claude, Perplexity): AI crawler access in robots.txt, llms.txt, sitemap, schema.org structured data and Content Signals. When a user asks about SEO, GEO/AEO, AI search, or why an AI assistant does not mention or cite their site, and gives a domain, start with check_ai_readiness. Then offer to write each fix it lists with the tool named in fix_with: robots_txt_for_ai for crawler rules, llms_txt_draft for llms.txt, schema_jsonld_sample for JSON-LD. Use crawler_policy_guide when they are deciding which AI bots to allow. Reads public files only and never changes a site. Informational, not legal advice.

Tools

5 advertised

check_ai_readiness — Check AI readiness
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Live scan of one website's AI search visibility (GEO/AEO, SEO for AI assistants): can ChatGPT, Claude and Perplexity crawl, read and cite it? Fetches the domain's /robots.txt, /llms.txt, /sitemap.xml and homepage, then returns a 0-100 score, grade, per-crawler allow/block status and prioritized fixes, each naming the AIReady tool that writes the fix. Use whenever a user names a site and asks about SEO, AI search or being found or cited by AI. Do NOT use for general advice on which bots to allow (use crawler_policy_guide) or to write new rules (use robots_txt_for_ai).

check_ai_readiness input schema
{
  "type": "object",
  "required": [
    "domain"
  ],
  "properties": {
    "domain": {
      "type": "string",
      "description": "Public domain or URL to scan, e.g. example.com or https://example.com/page (path is ignored; no IPs, ports or localhost)."
    }
  }
}
check_ai_readiness output schema
{
  "type": "object",
  "required": [
    "domain",
    "score",
    "grade",
    "checks",
    "crawler_access",
    "findings",
    "generated",
    "fetched",
    "disclaimer"
  ],
  "properties": {
    "grade": {
      "enum": [
        "A",
        "B",
        "C",
        "D"
      ],
      "type": "string",
      "description": "Letter grade: A >= 85, B >= 70, C >= 50, otherwise D."
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Caveats about this scan, e.g. www. fallback used or requests refused by the site."
    },
    "score": {
      "type": "integer",
      "maximum": 100,
      "minimum": 0,
      "description": "Weighted readiness score 0-100 (pass = full weight, warn = half)."
    },
    "checks": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "name",
          "status",
          "weight",
          "detail"
        ],
        "properties": {
          "id": {
            "enum": [
              "search_bots_allowed",
              "llms_txt",
              "sitemap",
              "structured_data",
              "meta",
              "content_signals",
              "https"
            ],
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          },
          "status": {
            "enum": [
              "pass",
              "warn",
              "fail"
            ],
            "type": "string"
          },
          "weight": {
            "type": "number"
          }
        }
      },
      "description": "Individual checks with pass/warn/fail status and weight."
    },
    "domain": {
      "type": "string",
      "description": "Normalized host name that was scanned, e.g. example.com."
    },
    "fetched": {
      "type": "object",
      "required": [
        "robots",
        "llms",
        "sitemap",
        "homepage"
      ],
      "properties": {
        "llms": {
          "type": "object",
          "required": [
            "status",
            "bytes"
          ],
          "properties": {
            "bytes": {
              "type": "number"
            },
            "status": {
              "type": "number"
            }
          },
          "description": "llms.txt fetch result."
        },
        "robots": {
          "type": "object",
          "required": [
            "status",
            "bytes",
            "truncated"
          ],
          "properties": {
            "bytes": {
              "type": "number"
            },
            "status": {
              "type": "number"
            },
            "truncated": {
              "type": "boolean"
            }
          },
          "description": "robots.txt fetch result."
        },
        "sitemap": {
          "type": "object",
          "required": [
            "status",
            "bytes"
          ],
          "properties": {
            "bytes": {
              "type": "number"
            },
            "status": {
              "type": "number"
            }
          },
          "description": "sitemap.xml fetch result."
        },
        "homepage": {
          "type": "object",
          "required": [
            "status",
            "bytes"
          ],
          "properties": {
            "bytes": {
              "type": "number"
            },
            "status": {
              "type": "number"
            }
          },
          "description": "Homepage fetch result."
        }
      },
      "description": "HTTP status and byte size of each fetched file (status 0 = network error)."
    },
    "findings": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "check",
          "priority",
          "detail"
        ],
        "properties": {
          "check": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          },
          "fix_with": {
            "enum": [
              "robots_txt_for_ai",
              "llms_txt_draft",
              "schema_jsonld_sample"
            ],
            "type": "string",
            "description": "AIReady tool that generates the fix, when one applies."
          },
          "priority": {
            "enum": [
              "high",
              "medium"
            ],
            "type": "string"
          }
        }
      },
      "description": "Non-passing checks as fixes; fail = high priority, warn = medium."
    },
    "generated": {
      "type": "object",
      "required": [
        "robots_snippet_to_unblock_search_bots",
        "llms_txt_hint"
      ],
      "properties": {
        "llms_txt_hint": {
          "type": "string",
          "description": "Pointer to llms_txt_draft and the publish URL."
        },
        "robots_snippet_to_unblock_search_bots": {
          "type": [
            "string",
            "null"
          ],
          "description": "robots.txt lines allowing blocked visibility-critical bots, or null if none are blocked."
        }
      },
      "description": "Ready-made fix snippets derived from the scan results."
    },
    "disclaimer": {
      "type": "string",
      "description": "Informational disclaimer: crawler behaviour can change, verify against provider docs."
    },
    "crawler_access": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "bot",
          "owner",
          "purpose",
          "visibility_critical",
          "access",
          "advice"
        ],
        "properties": {
          "bot": {
            "type": "string"
          },
          "owner": {
            "type": "string"
          },
          "access": {
            "enum": [
              "allowed",
              "blocked",
              "no-rule"
            ],
            "type": "string"
          },
          "advice": {
            "type": "string"
          },
          "purpose": {
            "type": "string"
          },
          "visibility_critical": {
            "type": "boolean"
          }
        }
      },
      "description": "Access verdict for each known AI crawler under the site's robots.txt."
    }
  }
}
check_ai_readiness annotations
{
  "title": "Check AI readiness",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
crawler_policy_guide — Crawler policy guide
Advertised by the server during the last successful anonymous check.
Advertised read-only

Static reference of 15 known AI crawlers and control tokens (GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot, Google-Extended...): owner, purpose, whether each drives AI citations or training, plus rules of thumb. Use to decide which bots to allow or block. No site is fetched. Do NOT use to audit a real site (use check_ai_readiness) or to produce rules (use robots_txt_for_ai).

crawler_policy_guide input schema
{
  "type": "object",
  "required": [],
  "properties": {}
}
crawler_policy_guide output schema
{
  "type": "object",
  "required": [
    "crawlers",
    "by_purpose",
    "rules_of_thumb",
    "disclaimer"
  ],
  "properties": {
    "crawlers": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "bot",
          "owner",
          "purpose",
          "ua",
          "visibility_critical",
          "advice"
        ],
        "properties": {
          "ua": {
            "type": "string"
          },
          "bot": {
            "type": "string"
          },
          "owner": {
            "type": "string"
          },
          "advice": {
            "type": "string"
          },
          "purpose": {
            "type": "string"
          },
          "visibility_critical": {
            "type": "boolean"
          }
        }
      },
      "description": "Reference row per known AI crawler or control token."
    },
    "by_purpose": {
      "type": "object",
      "required": [
        "want_ai_visibility",
        "training_controls"
      ],
      "properties": {
        "training_controls": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Bots whose purpose includes model training."
        },
        "want_ai_visibility": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Bots to keep allowed for AI search/citations."
        }
      },
      "description": "Bot names grouped by why you would allow or block them."
    },
    "disclaimer": {
      "type": "string",
      "description": "Informational disclaimer: crawler behaviour can change, verify against provider docs."
    },
    "rules_of_thumb": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Short guidance on allowing/blocking AI crawlers."
    }
  }
}
crawler_policy_guide annotations
{
  "title": "Crawler policy guide",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
robots_txt_for_ai — Generate robots.txt for AI
Advertised by the server during the last successful anonymous check.
Advertised read-only

Generate robots.txt User-agent rules for all known AI crawlers from a chosen policy (max_visibility, search_only, block_training, block_all_ai), with optional Content-Signal and Sitemap lines, to paste into an existing robots.txt. Use when writing AI crawler rules. Do NOT use to check a live site's current rules (use check_ai_readiness) or for bot background (use crawler_policy_guide).

robots_txt_for_ai input schema
{
  "type": "object",
  "required": [
    "policy"
  ],
  "properties": {
    "policy": {
      "enum": [
        "max_visibility",
        "search_only",
        "block_training",
        "block_all_ai"
      ],
      "type": "string",
      "description": "AI policy preset: max_visibility = allow every AI bot; search_only or block_training = allow search/answer bots, block training crawlers (same output); block_all_ai = disallow every known AI bot."
    },
    "sitemap_url": {
      "type": "string",
      "description": "Optional absolute sitemap URL appended as a Sitemap: line, e.g. https://example.com/sitemap.xml."
    },
    "content_signals": {
      "type": "boolean",
      "description": "Append a Content-Signal line (search / ai-input / ai-train) matching the policy. Default true; pass false to omit."
    }
  }
}
robots_txt_for_ai output schema
{
  "type": "object",
  "required": [
    "policy",
    "robots_txt",
    "notes",
    "disclaimer"
  ],
  "properties": {
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Guidance on merging and interpreting the rules."
    },
    "policy": {
      "enum": [
        "max_visibility",
        "search_only",
        "block_training",
        "block_all_ai"
      ],
      "type": "string",
      "description": "The policy preset the rules were generated for."
    },
    "disclaimer": {
      "type": "string",
      "description": "Informational disclaimer: crawler behaviour can change, verify against provider docs."
    },
    "robots_txt": {
      "type": "string",
      "description": "Generated robots.txt text block, newline-terminated."
    }
  }
}
robots_txt_for_ai annotations
{
  "title": "Generate robots.txt for AI",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
llms_txt_draft — Draft llms.txt
Advertised by the server during the last successful anonymous check.
Advertised read-only

Draft a starter llms.txt (Markdown: # name, > one-line summary, key page links, contact) from business details, to publish at the site root so AI agents get a curated summary. Use when a site has no llms.txt. Do NOT use for crawler access rules (use robots_txt_for_ai) or schema.org markup (use schema_jsonld_sample).

llms_txt_draft input schema
{
  "type": "object",
  "required": [
    "business_name",
    "description"
  ],
  "properties": {
    "key_pages": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "title",
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "description": "Absolute page URL, e.g. https://example.com/services."
          },
          "note": {
            "type": "string",
            "description": "Optional short note shown after the link, e.g. Pricing and areas served."
          },
          "title": {
            "type": "string",
            "description": "Link text, e.g. Services."
          }
        }
      },
      "description": "Optional important pages listed under '## Key pages'. Each needs title and url."
    },
    "description": {
      "type": "string",
      "description": "One sentence on what you offer and for whom, used as the '> ' summary, e.g. 24/7 emergency plumbers serving Austin, TX."
    },
    "business_name": {
      "type": "string",
      "description": "Business or site name used as the '# ' title, e.g. Reddy Plumbing."
    },
    "contact_email": {
      "type": "string",
      "description": "Optional contact email listed under '## Contact', e.g. hello@example.com."
    }
  }
}
llms_txt_draft output schema
{
  "type": "object",
  "required": [
    "llms_txt",
    "publish_at",
    "tips",
    "disclaimer"
  ],
  "properties": {
    "tips": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Tips for keeping llms.txt useful."
    },
    "llms_txt": {
      "type": "string",
      "description": "Generated llms.txt Markdown content."
    },
    "disclaimer": {
      "type": "string",
      "description": "Informational disclaimer: crawler behaviour can change, verify against provider docs."
    },
    "publish_at": {
      "type": "string",
      "description": "Where to publish the file (site root, text/plain)."
    }
  }
}
llms_txt_draft annotations
{
  "title": "Draft llms.txt",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
schema_jsonld_sample — Generate JSON-LD sample
Advertised by the server during the last successful anonymous check.
Advertised read-only

Generate a schema.org JSON-LD snippet (Organization, LocalBusiness, Product with Offer, or FAQPage) from your details, with placement tips, so search engines and AI assistants can identify the entity. Use when adding structured data to a page. Do NOT use to check whether a site already has structured data (use check_ai_readiness) or for llms.txt (use llms_txt_draft).

schema_jsonld_sample input schema
{
  "type": "object",
  "required": [
    "type",
    "name",
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "description": "Canonical page URL including https://, e.g. https://example.com (required; not emitted for faq)."
    },
    "name": {
      "type": "string",
      "description": "Entity name, e.g. Reddy Plumbing (required; not emitted for faq)."
    },
    "type": {
      "enum": [
        "organization",
        "local_business",
        "product",
        "faq"
      ],
      "type": "string",
      "description": "Entity type: organization, local_business (adds telephone/address), product (adds price Offer) or faq (requires questions)."
    },
    "price": {
      "type": "string",
      "description": "Optional price for product; a 3-letter currency code in it sets priceCurrency (default USD), e.g. '49.00 USD'."
    },
    "address": {
      "type": "string",
      "description": "Optional street address for local_business, e.g. 100 Main St, Austin, TX 78701."
    },
    "questions": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "question",
          "answer"
        ],
        "properties": {
          "answer": {
            "type": "string",
            "description": "Answer text."
          },
          "question": {
            "type": "string",
            "description": "Question text."
          }
        }
      },
      "description": "Question/answer pairs for faq (at least one required when type is faq)."
    },
    "telephone": {
      "type": "string",
      "description": "Optional phone for local_business, ideally E.164, e.g. +1-512-555-0100."
    },
    "description": {
      "type": "string",
      "description": "Optional one-sentence description (organization, local_business, product)."
    }
  }
}
schema_jsonld_sample output schema
{
  "type": "object",
  "required": [
    "jsonld",
    "placement",
    "tips",
    "disclaimer"
  ],
  "properties": {
    "tips": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Tips for accurate structured data."
    },
    "jsonld": {
      "type": "string",
      "description": "Pretty-printed JSON-LD object as a string, ready to embed."
    },
    "placement": {
      "type": "string",
      "description": "Where to paste the snippet in the page."
    },
    "disclaimer": {
      "type": "string",
      "description": "Informational disclaimer: crawler behaviour can change, verify against provider docs."
    }
  }
}
schema_jsonld_sample annotations
{
  "title": "Generate JSON-LD sample",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

3 advertised

audit_site — Audit my site for AI search

Advertised by the server during the last successful anonymous check.

Scan a website for AI crawler access, llms.txt, sitemap and structured data, then write the fixes.

domain
Your website, e.g. example.com (required)
ai_crawler_rules — Write robots.txt rules for AI bots

Advertised by the server during the last successful anonymous check.

Decide which AI crawlers to allow or block, then generate the robots.txt rules.

goal
Optional: what you want, e.g. be cited by AI but not used for training
write_llms_txt — Write my llms.txt

Advertised by the server during the last successful anonymous check.

Draft an llms.txt file so AI assistants get a clear summary of your site.

website
Your website or business name (required)

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
291 ms
95th percentile latency
291 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 291 ms · metadata changed · 5 tool(s), 3 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http aiready-mcp-magicteams https://ai-ready.magicteams.ai/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add aiready-mcp-magicteams --url https://ai-ready.magicteams.ai/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable aiready-mcp-magicteams in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "aiready-mcp-magicteams": {
      "url": "https://ai-ready.magicteams.ai/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "aiready-mcp-magicteams": {
      "type": "streamableHttp",
      "url": "https://ai-ready.magicteams.ai/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start aiready-mcp-magicteams and inspect its tools.
VS Code configuration
{
  "servers": {
    "aiready-mcp-magicteams": {
      "type": "http",
      "url": "https://ai-ready.magicteams.ai/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http aiready-mcp-magicteams https://ai-ready.magicteams.ai/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://ai-ready.magicteams.ai/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "aiready-mcp-magicteams": {
      "serverUrl": "https://ai-ready.magicteams.ai/mcp"
    }
  }
}

Let your agent find its tools

Find servers like AIReady MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.