{
  "name": "com.indexerpal/indexerpal",
  "title": "IndexerPal",
  "description": "Website and backlink indexing: get pages and backlinks indexed in Google, Bing and Yandex through IndexerPal's own indexing system, verify each one in Google, follow every URL's status, buy credits.",
  "version": "1.0.0",
  "websiteUrl": "https://indexerpal.com/developers/mcp",
  "icons": [
    {
      "src": "https://indexerpal.com/logo.png",
      "mimeType": "image/png",
      "sizes": [
        "512x512"
      ]
    }
  ],
  "serverInfo": {
    "name": "indexerpal",
    "title": "IndexerPal",
    "version": "1.0.0"
  },
  "protocolVersion": "2025-11-25",
  "supportedProtocolVersions": [
    "2025-11-25",
    "2025-06-18",
    "2025-03-26"
  ],
  "url": "https://indexerpal.com/mcp",
  "transport": {
    "type": "streamable-http",
    "endpoint": "https://indexerpal.com/mcp"
  },
  "remotes": [
    {
      "type": "streamable-http",
      "url": "https://indexerpal.com/mcp"
    }
  ],
  "capabilities": {
    "tools": {
      "listChanged": false
    },
    "resources": {
      "listChanged": false,
      "subscribe": false
    },
    "prompts": {
      "listChanged": false
    }
  },
  "authentication": {
    "required": true,
    "schemes": [
      "oauth2",
      "bearer"
    ],
    "authorization_servers": [
      "https://indexerpal.com"
    ],
    "resource_metadata": "https://indexerpal.com/.well-known/oauth-protected-resource/mcp",
    "scopes": [
      "read",
      "index",
      "purchase"
    ],
    "api_keys": "Bearer ipk_... from the dashboard (accounts with a paid order)."
  },
  "instructions": "IndexerPal gets web pages and backlinks indexed in Google (and Bing and Yandex) through its own indexing system, then verifies every URL in Google: within the hour for instant indexing, and on day 4 and day 14 for all.\n\nTypical flow:\n1. get_account: balance, and whether the account can index yet (paid = true after a first purchase).\n2. If credits are missing: buy_credits returns a Stripe checkout link. Give it to the user to pay, then poll get_order until it is paid.\n3. estimate_cost to see the credits a list will cost and which URLs are invalid; ask the user before large spends.\n4. submit_urls (pages or backlinks), submit_sitemap (a whole sitemap), add_urls (more URLs for an existing project), or check_urls (only check if indexed).\n5. Later: get_project and list_links for statuses and the index rate. Indexing takes hours to days; do not poll more than every few minutes.\n\nURLs still not indexed at the final check get their credits back automatically. Never promise rankings.",
  "tools": [
    {
      "name": "get_account",
      "title": "Get account",
      "description": "The account behind this credential: credit balance, whether it can index yet (it needs one paid order), this credential's scopes, today's usage and the limits.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "title": "Get account",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_pricing",
      "title": "Get pricing",
      "description": "Credit packs and prices (one-time payments in US dollars, credits never expire), what each action costs in credits, and when URLs are checked in Google.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "title": "Get pricing",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "estimate_cost",
      "title": "Estimate cost",
      "description": "How many credits a submission would cost, before spending anything. Send the URLs to also learn how many are valid, duplicated or not indexable. With a credential, says whether the balance covers it.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "kind": {
            "default": "standard",
            "description": "standard or instant indexing, or check (index checker).",
            "type": "string",
            "enum": [
              "standard",
              "instant",
              "check"
            ]
          },
          "urls": {
            "description": "The URLs you plan to send.",
            "maxItems": 20000,
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 4096
            }
          },
          "count": {
            "description": "Or just a number of URLs.",
            "type": "integer",
            "minimum": 1,
            "maximum": 10000
          }
        }
      },
      "annotations": {
        "title": "Estimate cost",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "submit_urls",
      "title": "Index URLs",
      "description": "Creates an indexing project: IndexerPal's own indexing system gets the pages or backlinks indexed in Google (and Bing and Yandex unless turned off), then verifies each URL in Google (instant: within the hour; all: day 4 and day 14). Spends credits at once (1 per URL standard, 3 instant). Returns the project; follow it with get_project. Needs a paid account.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "urls": {
            "minItems": 1,
            "maxItems": 20000,
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 4096
            },
            "description": "Absolute http(s) URLs, up to 10,000 after duplicates and invalid entries are removed."
          },
          "mode": {
            "default": "standard",
            "description": "standard: 1 credit per URL, usually hours to a few days. instant: 3 credits per URL, Google first in line, in as little as a few minutes.",
            "type": "string",
            "enum": [
              "standard",
              "instant"
            ]
          },
          "name": {
            "description": "Project name. Defaults to the first URL's domain.",
            "type": "string",
            "maxLength": 120
          },
          "bing": {
            "default": true,
            "description": "Also send to Bing. Same price.",
            "type": "boolean"
          },
          "yandex": {
            "default": true,
            "description": "Also send to Yandex. Same price.",
            "type": "boolean"
          },
          "drip_days": {
            "default": 0,
            "description": "Spread sending over this many days (0 = as fast as possible).",
            "type": "number",
            "enum": [
              0,
              3,
              7,
              14,
              30
            ]
          },
          "idempotency_key": {
            "description": "Optional. Reuse the same key when retrying this call: a retry returns the first result and spends nothing twice. (REST clients can send the Idempotency-Key header instead.)",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "urls"
        ]
      },
      "annotations": {
        "title": "Index URLs",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "submit_sitemap",
      "title": "Index a sitemap",
      "description": "Reads an XML sitemap (or sitemap index, one level deep; .xml.gz works) and creates an indexing project with its page URLs in one step. Set skip_already_submitted to send only URLs this account never submitted before, which suits recurring runs. Needs a paid account.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "sitemap_url": {
            "type": "string",
            "maxLength": 2048,
            "description": "Absolute URL of the sitemap."
          },
          "skip_already_submitted": {
            "default": false,
            "description": "Leave out URLs already sent in an earlier project of this account.",
            "type": "boolean"
          },
          "mode": {
            "default": "standard",
            "description": "standard: 1 credit per URL, usually hours to a few days. instant: 3 credits per URL, Google first in line, in as little as a few minutes.",
            "type": "string",
            "enum": [
              "standard",
              "instant"
            ]
          },
          "name": {
            "description": "Project name. Defaults to the first URL's domain.",
            "type": "string",
            "maxLength": 120
          },
          "bing": {
            "default": true,
            "description": "Also send to Bing. Same price.",
            "type": "boolean"
          },
          "yandex": {
            "default": true,
            "description": "Also send to Yandex. Same price.",
            "type": "boolean"
          },
          "drip_days": {
            "default": 0,
            "description": "Spread sending over this many days (0 = as fast as possible).",
            "type": "number",
            "enum": [
              0,
              3,
              7,
              14,
              30
            ]
          },
          "idempotency_key": {
            "description": "Optional. Reuse the same key when retrying this call: a retry returns the first result and spends nothing twice. (REST clients can send the Idempotency-Key header instead.)",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "sitemap_url"
        ]
      },
      "annotations": {
        "title": "Index a sitemap",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "add_urls",
      "title": "Add URLs to a project",
      "description": "Adds URLs to an existing indexing project. They are sent with the project's settings (mode, search engines, drip feed from now) and spend credits at once. URLs already in the project are skipped and cost nothing. A finished project becomes active again. Up to 10,000 URLs per call, 50,000 per project. Needs a paid account.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "project_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 36,
            "description": "A project id, as returned by submit_urls, check_urls or list_projects."
          },
          "urls": {
            "minItems": 1,
            "maxItems": 20000,
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 4096
            },
            "description": "Absolute http(s) URLs, up to 10,000 after duplicates and invalid entries are removed."
          },
          "idempotency_key": {
            "description": "Optional. Reuse the same key when retrying this call: a retry returns the first result and spends nothing twice. (REST clients can send the Idempotency-Key header instead.)",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "project_id",
          "urls"
        ]
      },
      "annotations": {
        "title": "Add URLs to a project",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "check_urls",
      "title": "Check if URLs are indexed",
      "description": "The index checker: looks each URL up in Google without sending anything. 10 URLs per credit (rounded up). Results usually arrive within the hour; read them with get_project and list_links. Needs a paid account.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "urls": {
            "minItems": 1,
            "maxItems": 20000,
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 4096
            },
            "description": "Absolute http(s) URLs, up to 10,000 after duplicates and invalid entries are removed."
          },
          "name": {
            "description": "Name for this check.",
            "type": "string",
            "maxLength": 120
          },
          "idempotency_key": {
            "description": "Optional. Reuse the same key when retrying this call: a retry returns the first result and spends nothing twice. (REST clients can send the Idempotency-Key header instead.)",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "urls"
        ]
      },
      "annotations": {
        "title": "Check if URLs are indexed",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "list_projects",
      "title": "List projects",
      "description": "Indexing projects and index checks on this account, newest first, with their counts and index rate.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "kind": {
            "default": "all",
            "type": "string",
            "enum": [
              "all",
              "index",
              "check"
            ]
          },
          "status": {
            "default": "any",
            "type": "string",
            "enum": [
              "any",
              "active",
              "completed"
            ]
          },
          "limit": {
            "default": 50,
            "type": "integer",
            "minimum": 1,
            "maximum": 200
          },
          "offset": {
            "default": 0,
            "type": "integer",
            "minimum": 0,
            "maximum": 100000
          }
        }
      },
      "annotations": {
        "title": "List projects",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_project",
      "title": "Get project",
      "description": "One project or check: live counts per status, index rate, credits spent and returned.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "project_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 36,
            "description": "A project id, as returned by submit_urls, check_urls or list_projects."
          }
        },
        "required": [
          "project_id"
        ]
      },
      "annotations": {
        "title": "Get project",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "list_links",
      "title": "List a project's URLs",
      "description": "The URLs of a project with their status (scheduled, queued, pushed, sent, indexed, not_indexed, failed), dates and next check. Filter by group and search by text; paginated.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "project_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 36,
            "description": "A project id, as returned by submit_urls, check_urls or list_projects."
          },
          "status": {
            "default": "all",
            "description": "all, indexed, checking (sent, not checked yet), waiting (not sent yet), not_indexed, failed.",
            "type": "string",
            "enum": [
              "all",
              "indexed",
              "checking",
              "waiting",
              "not_indexed",
              "failed"
            ]
          },
          "q": {
            "description": "Only URLs containing this text.",
            "type": "string",
            "maxLength": 200
          },
          "page": {
            "default": 1,
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          },
          "per_page": {
            "default": 100,
            "type": "integer",
            "minimum": 1,
            "maximum": 500
          }
        },
        "required": [
          "project_id"
        ]
      },
      "annotations": {
        "title": "List a project's URLs",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "cancel_pending_links",
      "title": "Cancel unsent URLs",
      "description": "Takes the URLs of a project that haven't been sent yet (drip feed or queue) out, and returns their credits. URLs already sent are not affected.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "project_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 36,
            "description": "A project id, as returned by submit_urls, check_urls or list_projects."
          }
        },
        "required": [
          "project_id"
        ]
      },
      "annotations": {
        "title": "Cancel unsent URLs",
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "rename_project",
      "title": "Rename project",
      "description": "Changes a project's or check's name.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "project_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 36,
            "description": "A project id, as returned by submit_urls, check_urls or list_projects."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120
          }
        },
        "required": [
          "project_id",
          "name"
        ]
      },
      "annotations": {
        "title": "Rename project",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "read_sitemap",
      "title": "Read a sitemap",
      "description": "Lists the page URLs in an XML sitemap (or sitemap index) without submitting anything. To index a whole sitemap in one step, use submit_sitemap.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "maxLength": 2048,
            "description": "Absolute URL of the sitemap."
          },
          "limit": {
            "default": 1000,
            "description": "Most URLs to return.",
            "type": "integer",
            "minimum": 1,
            "maximum": 10000
          }
        },
        "required": [
          "url"
        ]
      },
      "annotations": {
        "title": "Read a sitemap",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "buy_credits",
      "title": "Buy credits",
      "description": "Creates a secure Stripe checkout link for a credit pack. Give checkout_url to the account owner to pay by card; credits arrive the moment they pay. Poll get_order to know when. Prices are final: nothing is added at checkout.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "pack": {
            "type": "string",
            "enum": [
              "basic",
              "pro",
              "premium",
              "agency"
            ],
            "description": "Credit pack: basic ($9.99, 150 credits), pro ($29.99, 500 credits), premium ($59.99, 1,100 credits), agency ($149.99, 3,000 credits)."
          },
          "locale": {
            "description": "Language of the checkout page. Defaults to the account's language.",
            "type": "string",
            "enum": [
              "en",
              "fr",
              "it",
              "de",
              "es"
            ]
          },
          "idempotency_key": {
            "description": "Optional. Reuse the same key when retrying this call: a retry returns the first result and spends nothing twice. (REST clients can send the Idempotency-Key header instead.)",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "pack"
        ]
      },
      "annotations": {
        "title": "Buy credits",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "get_order",
      "title": "Get order",
      "description": "A credit purchase: pending until the person pays, then paid (credits added). Use it to wait for a checkout link to be paid.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "order_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 36
          }
        },
        "required": [
          "order_id"
        ]
      },
      "annotations": {
        "title": "Get order",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "list_orders",
      "title": "List orders",
      "description": "Credit purchases on this account, newest first (paid, refunded, and checkouts still open).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "default": 20,
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          }
        }
      },
      "annotations": {
        "title": "List orders",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_credit_history",
      "title": "Credit history",
      "description": "Every change to the balance, newest first: purchases, credits spent on projects, credits back for URLs not indexed, refunds.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "default": 50,
            "type": "integer",
            "minimum": 1,
            "maximum": 200
          }
        }
      },
      "annotations": {
        "title": "Credit history",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    }
  ],
  "resources": [
    {
      "uri": "indexerpal://guide",
      "name": "guide",
      "mimeType": "text/markdown"
    },
    {
      "uri": "indexerpal://pricing",
      "name": "pricing",
      "mimeType": "application/json"
    }
  ],
  "prompts": [
    {
      "name": "index_urls"
    },
    {
      "name": "audit_backlinks"
    },
    {
      "name": "index_sitemap"
    }
  ]
}