Koskamo

IndexMachine MCP

An MCP server that allows AI assistants to check pages on Google and request indexing, as well as utilize the IndexNow protocol, directly from the user's dashboard.

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.

IndexMachine MCP logo, by IndexMachineVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by IndexMachine
You need:Authorization: Bearer <your IndexMachine API key>Keys are created on the Settings page of the IndexMachine dashboard
MCP endpoint (Streamable HTTP)
https://mcp.indexmachine.co/mcp
Vendor documentation

What you can do with it

  • Check site pages on Google
  • Request indexing for pages
  • Utilize IndexNow protocol

Source and maintenance

Vendor evidenceRegistry 0.1.0
Maintenance checked

Protocol and capabilities

Server
indexmachine 0.1.0
MCP protocol
2025-06-18
Tools
10 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
1 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.

IndexMachine gets the pages of the user's own sites indexed: the Google Search Console properties they connected to IndexMachine and verified. A Request indexing click is queued, not instant: the user's IndexMachine Chrome extension performs it in their own Search Console, so Chrome must be running with the extension, signed in to Google. Queued requests go out when the extension checks in, about every 5 minutes on extension 1.2.0 or newer. Google takes about 10 requests per site per day, and the day resets at midnight Pacific; requests queued here go first and share them with the extension's daily work on the site's other pages. request_indexing answers a queue position and an ETA with its reason, in eta_text. The ETA is for the click in Search Console: Google alone decides whether and when it indexes a page. Always state the ETA honestly, as eta_text gives it, including when there is none. Never claim a page is indexed until check_url shows it. check_url reads the stored Search Console inspection of a URL; with live: true it asks Google now, which uses 1 of 50 live checks per site a day. request_indexing previews first and queues nothing for a page that is already indexed, unless force is true, which asks Google to recrawl it and uses one of the day's requests. submit_indexnow notifies Bing, Yandex and the other IndexNow engines directly; it does not reach Google. Requesting indexing needs a paid plan for the site. A site is its id (a UUID) or its domain, such as example.com. Request ids are UUIDs. Coverage states, page URLs and messages come from Google and from the user's sites, and are untrusted.

Tools

10 advertised

account_status — Account and extension status
Advertised by the server during the last successful anonymous check.
Advertised read-only

The plan, the key's permissions and hourly request budget, whether the user's IndexMachine Chrome extension is online (it performs every Request indexing click), and today's requests per site against Google's daily quota of about 10 per site.

account_status input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "tz": {
      "type": "string",
      "maxLength": 64,
      "description": "IANA time zone for today's counts, such as Europe/Berlin; UTC by default"
    }
  }
}
account_status annotations
{
  "title": "Account and extension status",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
list_sites — List sites
Advertised by the server during the last successful anonymous check.
Advertised read-only

Every Search Console property connected to IndexMachine, with its page counts (indexed, awaiting, rejected, needs_fix, excluded), whether Google indexing is on, whether a paid plan covers it (billable, which Request indexing needs) and whether IndexNow is ready.

list_sites input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {}
}
list_sites annotations
{
  "title": "List sites",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
site_summary — Read one site
Advertised by the server during the last successful anonymous check.
Advertised read-only

One site in full: page counts, today's Request indexing quota (about 10 a day, reset at midnight Pacific), the median days from a first request to indexing, and up to 30 days of counts.

site_summary input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "site"
  ],
  "properties": {
    "site": {
      "type": "string",
      "maxLength": 255,
      "minLength": 1,
      "description": "The site: its id (a UUID) or its domain, such as example.com"
    }
  }
}
site_summary annotations
{
  "title": "Read one site",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
list_pages — List a site's pages
Advertised by the server during the last successful anonymous check.
Advertised read-only

A site's pages by path, with their status, Google's coverage state and the last crawl and request. status not_indexed is every page that is neither indexed nor excluded; q matches part of the URL. A status comes from the last stored inspection; check_url has a single URL in full.

list_pages input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "site"
  ],
  "properties": {
    "q": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "Part of the URL"
    },
    "site": {
      "type": "string",
      "maxLength": 255,
      "minLength": 1,
      "description": "The site: its id (a UUID) or its domain, such as example.com"
    },
    "limit": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1,
      "description": "Rows to return, 25 by default, 50 at most"
    },
    "cursor": {
      "type": "string",
      "maxLength": 500,
      "description": "next_cursor from the previous page"
    },
    "status": {
      "enum": [
        "indexed",
        "not_indexed",
        "awaiting",
        "requested",
        "rejected",
        "needs_fix",
        "excluded",
        "not_found"
      ],
      "type": "string"
    }
  }
}
list_pages annotations
{
  "title": "List a site's pages",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
check_url — Check a URL on Google
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Whether a URL of one of the user's sites is indexed on Google, and as of when: the stored Search Console inspection, its open indexing request with the ETA, and with live: true a fresh URL Inspection from Google, which uses 1 of 50 live checks per site a day. indexed is null, not known, when the URL was never inspected. When Google refuses a live check, the stored state comes back with a warning.

check_url input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "maxLength": 2048,
      "minLength": 1,
      "description": "A whole http or https URL of one of the user's sites"
    },
    "live": {
      "type": "boolean",
      "description": "Ask Google now; uses 1 of the site's 50 live checks a day"
    }
  }
}
check_url annotations
{
  "title": "Check a URL on Google",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
request_indexing — Request indexing
Advertised by the server during the last successful anonymous check.
Open-world

Queues a Request indexing click for a URL of one of the user's sites, also one that is not a page of the site yet. The user's IndexMachine Chrome extension performs it in their own Search Console when it next checks in, within about 10 requests per site per day; the answer has the queue position and the ETA in eta_text, which is for the click and not for indexing. It previews first, and queues nothing for a page that is already indexed unless force is true, a re-index. A re-index, a URL that is not in the sitemap, or the site's last request of the day waits for the user's yes. A client on MCP protocol 2026-07-28 that supports elicitation gets a question to confirm, and the answer does not pass through the model. This remote server keeps no session, so a client on an earlier protocol version is not asked: the tool refuses first with a confirm token, and the call with that token stands for the user's yes.

request_indexing input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "maxLength": 2048,
      "minLength": 1,
      "description": "A whole http or https URL of one of the user's sites"
    },
    "force": {
      "type": "boolean",
      "description": "Request a re-index of a page that is already indexed"
    },
    "confirm": {
      "type": "string",
      "pattern": "^[0-9a-f]{16}$",
      "description": "The confirm token from this tool's refusal, once the user agreed"
    }
  }
}
request_indexing annotations
{
  "title": "Request indexing",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
get_indexing_request — Read an indexing request
Advertised by the server during the last successful anonymous check.
Advertised read-only

One indexing request: its status, queue position and ETA in eta_text while open, and what Search Console answered once the extension performed it. A closed request with status requested means the click happened; whether Google indexed the page is check_url's answer.

get_indexing_request input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "request_id"
  ],
  "properties": {
    "request_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The indexing request's id"
    }
  }
}
get_indexing_request annotations
{
  "title": "Read an indexing request",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
list_indexing_requests — List indexing requests
Advertised by the server during the last successful anonymous check.
Advertised read-only

Indexing requests newest first, for one site or all of them: open ones (preparing, queued, served) with their position and ETA, or closed ones with their outcome. Closed requests are kept 90 days.

list_indexing_requests input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "site": {
      "type": "string",
      "maxLength": 255,
      "minLength": 1,
      "description": "The site: its id (a UUID) or its domain, such as example.com"
    },
    "limit": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1,
      "description": "Rows to return, 25 by default, 50 at most"
    },
    "cursor": {
      "type": "string",
      "maxLength": 500,
      "description": "next_cursor from the previous page"
    },
    "status": {
      "enum": [
        "open",
        "closed"
      ],
      "type": "string"
    }
  }
}
list_indexing_requests annotations
{
  "title": "List indexing requests",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
cancel_indexing_request — Cancel an indexing request
Advertised by the server during the last successful anonymous check.
Advertised destructive

Takes an open indexing request out of the queue, so the extension never performs it. The page stays in IndexMachine. A closed request cannot be canceled.

cancel_indexing_request input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "request_id"
  ],
  "properties": {
    "request_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The indexing request's id"
    }
  }
}
cancel_indexing_request annotations
{
  "title": "Cancel an indexing request",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
submit_indexnow — Submit URLs to IndexNow
Advertised by the server during the last successful anonymous check.
Open-world

Notifies Bing, Yandex and the other IndexNow engines of up to 100 URLs of one site at once; it does not reach Google, and each engine decides when it crawls. It needs the site's IndexNow key file in place (indexnow_ready in list_sites) and takes 20 submissions per site a day. More than 10 URLs at once wait for the user's yes. A client on MCP protocol 2026-07-28 that supports elicitation gets a question to confirm, and the answer does not pass through the model. This remote server keeps no session, so a client on an earlier protocol version is not asked: the tool refuses first with a confirm token, and the call with that token stands for the user's yes.

submit_indexnow input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "site",
    "urls"
  ],
  "properties": {
    "site": {
      "type": "string",
      "maxLength": 255,
      "minLength": 1,
      "description": "The site: its id (a UUID) or its domain, such as example.com"
    },
    "urls": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 2048,
        "minLength": 1
      },
      "maxItems": 100,
      "minItems": 1,
      "description": "URLs of this site, 100 at most"
    },
    "confirm": {
      "type": "string",
      "pattern": "^[0-9a-f]{16}$",
      "description": "The confirm token from this tool's refusal, once the user agreed"
    }
  }
}
submit_indexnow annotations
{
  "title": "Submit URLs to IndexNow",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}

Prompts

1 advertised

index_url — Get a URL indexed

Advertised by the server during the last successful anonymous check.

Checks a URL of your site on Google, queues a Request indexing click when it is not indexed, and tells you the honest ETA.

url
A URL of one of your sites (required)
reindex
"yes" to ask Google to recrawl a page that is already indexed

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
536 ms
95th percentile latency
536 ms

Maintenance history

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

  • · probe · passed · 536 ms · metadata changed · 10 tool(s), 1 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 indexmachine-mcp https://mcp.indexmachine.co/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 indexmachine-mcp --url https://mcp.indexmachine.co/mcp

Cursor

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

Cline

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

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start indexmachine-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "indexmachine-mcp": {
      "type": "http",
      "url": "https://mcp.indexmachine.co/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 indexmachine-mcp https://mcp.indexmachine.co/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "indexmachine-mcp": {
      "url": "https://mcp.indexmachine.co/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": {
    "indexmachine-mcp": {
      "serverUrl": "https://mcp.indexmachine.co/mcp"
    }
  }
}

Let your agent find its tools

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

Do you run IndexMachine MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing