IndexMachine

co.indexmachinePublished by indexmachine.coOfficial publisherv0.1.0Updated Oct 31, 2026

Check your own sites' pages on Google and request indexing, plus IndexNow, from your AI assistant.

VerifiedStreamable HTTPWeb executableProductivity & WorkflowWeb Search & Scraping

Overview

AI-generated overview

IndexMachine lets an assistant check whether pages of your own sites are indexed on Google, queue Request indexing clicks, and submit URLs to IndexNow.

What you can do
  • Check indexing status: look up whether a URL is indexed and as of when, optionally with a fresh live Google inspection.
  • Review sites and pages: list connected Search Console properties with page counts, and filter a site's pages by status or URL.
  • Queue and follow indexing requests: request indexing for a URL, then read its queue position, ETA and Search Console outcome, or cancel an open request.
  • Submit to IndexNow: notify Bing, Yandex and other IndexNow engines of up to 100 URLs of one site.
  • Check account state: plan, key permissions, hourly budget, extension online status and daily quota use.
When to use it
Useful when you own Search Console properties connected to IndexMachine and want an assistant to audit which pages Google has not indexed, queue Request indexing clicks, or push URLs to IndexNow without opening the dashboards yourself.
Requirements
An IndexMachine account with verified Search Console properties connected, and a paid plan for any site where indexing is requested. An API key (INDEXMACHINE_API_KEY for the local npx package, or an Authorization bearer header for the remote endpoint) created in the dashboard Settings page. The IndexMachine Chrome extension installed, signed in to the owning Google account and running, since it performs the clicks. Node.js 20 or newer for the local package; network access to the IndexMachine…
Before you install
The API key is a live credential (im_live_ prefix) that grants access to your sites; keep it out of repositories and revoke it if exposed. Full keys can queue and cancel requests and submit to IndexNow, so a read-only key is safer for checking only. Requesting indexing spends a limited daily quota (about 10 per site, reset at midnight Pacific) and needs a paid plan; live checks use 1 of 50 per site a day. cancel_indexing_request is marked destructive. Coverage states, URLs and messages from…

Installation

In SourceWeft

  1. Open IndexMachine in the dashboard and add it to a workspace.
  2. Connect Authorization token credentials. They are stored privately and never shown on public pages.
  3. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/co.indexmachine%2Fmcp/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "indexmachine": {
      "type": "http",
      "url": "https://mcp.indexmachine.co/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_TOKEN>"
      }
    }
  }
}

README

IndexMachine MCP server

Check your own sites' pages on Google and request indexing, plus IndexNow, from your AI assistant.

This MCP server lets Claude Code, Cursor, VS Code, Claude Desktop and claude.ai work with the sites you connected to IndexMachine: list your sites and pages, check whether a URL is on Google, queue a Request indexing click (also a re-index of a page that is already indexed) and notify Bing and the other IndexNow engines. It calls the IndexMachine API with your key and does nothing the API does not.

How a request really travels

IndexMachine uses Request indexing in your own Google Search Console and IndexNow, no link farms. So a request is not instant, and the server says so every time:

  1. request_indexing queues the click. It does not reach Google by itself.
  2. The IndexMachine Chrome extension, in your Chrome and signed in to the Google account that owns the property, picks the request up when it next checks in: about every 5 minutes on extension 1.2.0 or newer, every 30 minutes on older versions. Chrome has to be running. When the extension has not checked in for 40 minutes there is no ETA, and the request waits in the queue.
  3. The extension clicks Request indexing in your Search Console, the same button you would press.
  4. Google takes about 10 of these requests per site per day, a day that resets at midnight Pacific. The number is observed; Google does not publish it. Requests you queue go ahead of the extension's daily work on your other pages and share the same 10. Once a site's day is used up, the ETA moves past midnight Pacific.
  5. Google then decides whether and when it indexes the page, often days later. The ETA is for the click, never for indexing, and only check_url says a page is indexed.

A re-index of a page that is already on Google (force: true) needs extension 1.2.0 or newer. IndexNow tells Bing, Yandex and the other IndexNow engines directly; it needs the site's IndexNow key file in place, takes 20 submissions per site a day and does not reach Google.

What you need

  • An IndexMachine account with your sites connected: app.indexmachine.co. Signing up is free and shows which of your pages Google has not indexed. Requesting indexing needs a paid plan for the site (pricing).
  • The IndexMachine Chrome extension, installed and signed in, for the Request indexing clicks.
  • An API key (with claude.ai you can add it as a request header, see Remote server).

Create an API key

  1. Open the IndexMachine dashboard and choose Settings from your profile menu, or go straight to app.indexmachine.co/settings.
  2. Under API keys press Create key and give it a label, such as Claude Code.
  3. Pick Full (it also queues and cancels requests and submits to IndexNow) or Read only (sites, pages, checks and requests).
  4. Copy the key. It starts with im_live_ and is shown only once.

Roll or revoke a key on the same page at any time; an account holds up to 10 active keys.

Install

The package runs on your machine with npx (Node.js 20 or newer). Keep the key in your user-level config, never in a file that lives in a repository.

Claude Code (user scope, so the key stays out of the project's .mcp.json)

sh
claude mcp add --scope user indexmachine --env INDEXMACHINE_API_KEY=im_live_... -- npx -y indexmachine-mcp

Cursor (~/.cursor/mcp.json, the user-level file)

json
{  "mcpServers": {    "indexmachine": {      "command": "npx",      "args": ["-y", "indexmachine-mcp"],      "env": { "INDEXMACHINE_API_KEY": "im_live_..." }    }  }}

VS Code (.vscode/mcp.json): VS Code asks for the key and keeps it out of the file.

json
{  "inputs": [    { "type": "promptString", "id": "indexmachine-key", "description": "IndexMachine API key", "password": true }  ],  "servers": {    "indexmachine": {      "type": "stdio",      "command": "npx",      "args": ["-y", "indexmachine-mcp"],      "env": { "INDEXMACHINE_API_KEY": "${input:indexmachine-key}" }    }  }}

Claude Desktop (claude_desktop_config.json): the same block as Cursor, under mcpServers.

Other MCP clients: run npx -y indexmachine-mcp with INDEXMACHINE_API_KEY in its environment, or use the remote server below.

Remote server

The remote server at https://mcp.indexmachine.co/mcp needs no install. Clients send the API key in a header:

URL:    https://mcp.indexmachine.co/mcpHeader: Authorization: Bearer <your key>   (X-API-Key: <your key> works too)

Claude Code

sh
claude mcp add --transport http indexmachine https://mcp.indexmachine.co/mcp \  --header "Authorization: Bearer $INDEXMACHINE_API_KEY"

Cursor (~/.cursor/mcp.json)

json
{  "mcpServers": {    "indexmachine": {      "url": "https://mcp.indexmachine.co/mcp",      "headers": { "Authorization": "Bearer im_live_..." }    }  }}

VS Code (.vscode/mcp.json)

json
{  "inputs": [    { "type": "promptString", "id": "indexmachine-key", "description": "IndexMachine API key", "password": true }  ],  "servers": {    "indexmachine": {      "type": "http",      "url": "https://mcp.indexmachine.co/mcp",      "headers": { "Authorization": "Bearer ${input:indexmachine-key}" }    }  }}

claude.ai: a custom connector

  1. In claude.ai, open Customize > Connectors, press + Add, then Add custom connector.
  2. Enter the name IndexMachine and the URL https://mcp.indexmachine.co/mcp.
  3. Under Request headers add Authorization with the value Bearer im_live_..., then press Add.
  4. In a chat, open +, then Connectors, and switch IndexMachine on.

IndexMachine and the Submitator connector can be on in the same chat: no tool name is shared.

Signing in with your IndexMachine account instead of a key (OAuth) is built into this server and stays off until IndexMachine's API issues sign-in tokens. Until then the server advertises no sign-in, and every client sends a key.

The remote server keeps nothing between requests: it passes the key on to the IndexMachine API and forgets it.

Tools

ToolWhat it does
account_statusYour plan, the key's permissions and hourly budget, whether the Chrome extension is online, and today's requests per site against Google's daily quota
list_sitesYour connected Search Console properties with page counts, whether Google indexing is on, whether a paid plan covers them and whether IndexNow is ready
site_summaryOne site: today's Request indexing quota, the median days from a first request to indexing, and 30 days of counts
list_pagesA site's pages by status (indexed, not_indexed, awaiting, requested, rejected, needs_fix, excluded, not_found) or part of the URL, 50 at most per call
check_urlWhether a URL is indexed, and as of when, or that it is not known yet (never inspected); live: true asks Google now and uses 1 of 50 live checks per site a day
request_indexingQueues a Request indexing click, also for a URL that is not a page of the site yet, and with force: true a re-index of an indexed page. Answers the queue position and an honest ETA
get_indexing_request, list_indexing_requestsFollow requests: open ones with their position and ETA, closed ones with what Search Console answered
cancel_indexing_requestTakes an open request out of the queue
submit_indexnowNotifies Bing, Yandex and the other IndexNow engines of up to 100 URLs of one site

Prompt: index_url checks a URL, queues a request when it is not indexed, and reports the ETA as it is.

Keys and safety

  • request_indexing previews before it queues. It asks you before a re-index of a page that is already on Google, a URL that is not in your sitemap, or your site's last request of the day; declining queues nothing. Clients that can ask their user (MCP elicitation) show the question themselves, and your answer never passes through the model; a question that gets no answer queues nothing either. Clients that cannot ask, and on the remote server clients on an MCP protocol before 2026-07-28, get a refusal first, with the reasons and a confirm token: an HMAC under your API key that fits only that request, on that day, while your site's quota stays as it was. The model cannot make one up, so a call always takes the refusal first. Whether your assistant then shows you the reasons before it sends the token back is up to the assistant and to your client's approval of tool calls; the server cannot see it. submit_indexnow does the same above 10 URLs, with a token for those URLs on that Pacific day.
  • cancel_indexing_request is marked destructive (destructiveHint: true), and no other tool is: it undoes a request. The tools that only read are marked read-only, so clients can run them without asking.
  • The npx package reads the key from its environment and sends it only to https://api.indexmachine.co. INDEXMACHINE_API_URL may point it to a local development server, and nowhere else.
  • A read-only key fits an assistant that only checks: sites, pages, URL checks and requests.
  • Every call carries a request id that starts with mcp-. Revoke a key on the Settings page at any time.
  • Report a vulnerability by email to [email protected], not in a public issue (SECURITY.md).

Development

sh
npm installnpm test               # unit, contract and protocol tests (it builds dist/ first)npm run buildnpm run sync:openapi   # refresh openapi/v1.json and src/v1.d.ts from https://api.indexmachine.co/v1/openapi.jsonnpm run check:pack     # pack, install in an empty folder, run the stdio handshakenpm run release:check  # what a release needs, then the publishing commands

openapi/v1.json is the /v1 contract, and the API serves the same document at /v1/openapi.json. When the API ships a new release, npm run sync:openapi and npm test show which new operations need a tool or a line in EXCLUDED (src/tools/index.ts).

The remote server deploys to Vercel (vercel.json, api/) under the domain mcp.indexmachine.co. OAuth turns on with MCP_OAUTH=1 and MCP_OAUTH_KEYS, the keys IndexMachine's API encrypts its access tokens with.

License

MIT

Source: README.md at commit a49e359

Tools

10

account_status

Account and extension status

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.

Parameterstz

list_sites

List sites

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.

Takes no parameters.

site_summary

Read one site

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.

Parameterssiterequired

list_pages

List a site's pages

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.

Parametersqsiterequiredlimitcursorstatus

check_url

Check a URL on Google

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.

Parametersurlrequiredlive

request_indexing

Request indexing

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.

Parametersurlrequiredforceconfirm

get_indexing_request

Read an indexing request

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.

Parametersrequest_idrequired

list_indexing_requests

List indexing requests

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.

Parameterssitelimitcursorstatus

cancel_indexing_request

Cancel an indexing request

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.

Parametersrequest_idrequired

submit_indexnow

Submit URLs to IndexNow

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.

Parameterssiterequiredurlsrequiredconfirm

Version history

1
  1. v0.1.0LatestOct 31, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts