Koskamo

apiwatch MCP

An MCP server that allows AI agents to check if a model ID or API has upcoming retirement or breaking changes. It provides details on what happens, the effective date, and recommended replacements based on a reviewed feed of vendor changes. It supports batch lookups, text search, and CI integration to fail builds on breaking changes.

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.

apiwatch MCP logo, by Reign Ventures LLCCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by Reign Ventures LLC
MCP endpoint (Streamable HTTP)
https://apiwatch.reignventures.co/mcp
Vendor documentation

What you can do with it

  • Check if an AI model ID has upcoming breaking changes
  • Look up retirement dates for APIs and endpoints
  • Search for vendor change summaries by text
  • Integrate change checks into GitHub Actions CI pipelines

Source and maintenance

Community listingRegistry 1.1.0
Maintenance checked

Protocol and capabilities

Server
apiwatch 1.1.0
MCP protocol
2025-06-18
Tools
7 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

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

apiwatch answers from its public feed of reviewed vendor changes (model retirements, breaking API changes, silent behavior changes, deprecations). Call check_model before using an AI model id, and check_identifiers before shipping code that names model ids, endpoints, tools or fields. "No record" means apiwatch has no record, not that something is safe. Read each record's scope: some apply only in certain repos or files. It also keeps a dated history of observed tool changes on some public MCP servers: call mcp_server_changes before relying on one of them.

Tools

7 advertised

check_model — Check an AI model id
Advertised by the server during the last successful anonymous check.
Advertised read-only

Look up one AI model id (for example gpt-4o-2024-05-13 or claude-sonnet-4-5) in apiwatch's reviewed feed of vendor changes before you use it in code. Returns a one line answer (when it stops working, changes behavior, or its deprecation key date) and each matching record with the date, what to do and the replacement, and links to the record and the vendor's source. "No record" means apiwatch has no record for it, not that it is safe. Records that apply only in some repos or files say so in scope.

check_model input schema
{
  "type": "object",
  "required": [
    "model"
  ],
  "properties": {
    "model": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "The model id as it appears in code"
    }
  },
  "additionalProperties": false
}
check_model output schema
{
  "type": "object",
  "required": [
    "model",
    "answer",
    "found",
    "truncated",
    "matches",
    "record_urls",
    "next_step"
  ],
  "properties": {
    "found": {
      "type": "boolean"
    },
    "model": {
      "type": "string"
    },
    "answer": {
      "type": "string"
    },
    "matches": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "vendor",
          "severity",
          "kind",
          "surface",
          "effective",
          "date_passed",
          "summary",
          "fix_hint",
          "scope",
          "record_url",
          "source_url",
          "matched_signature"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "scope": {
            "type": "string",
            "description": "Empty when the record applies to every caller; otherwise where it applies"
          },
          "vendor": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "surface": {
            "type": "string"
          },
          "fix_hint": {
            "type": "string"
          },
          "severity": {
            "enum": [
              "breaking",
              "silent",
              "deprecation",
              "additive",
              "info"
            ],
            "type": "string"
          },
          "effective": {
            "type": "string",
            "description": "Key date, YYYY-MM-DD"
          },
          "record_url": {
            "type": "string"
          },
          "source_url": {
            "type": "string"
          },
          "date_passed": {
            "type": "boolean",
            "description": "True when the key date is today or earlier (UTC)"
          },
          "matched_signature": {
            "type": "string"
          }
        }
      }
    },
    "next_step": {
      "type": "string"
    },
    "truncated": {
      "type": "boolean"
    },
    "record_urls": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}
check_model annotations
{
  "title": "Check an AI model id",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
check_identifiers — Check many identifiers
Advertised by the server during the last successful anonymous check.
Advertised read-only

Look up many identifiers at once before shipping code: model ids, API endpoints (/v1/assistants), MCP tool names, SDK methods or field names. For each one, a one line answer and the ids of matching records, plus the records themselves. A record scoped to some code (for example only repos that depend on a given SDK major version) is returned with that scope spelled out, never as an unconditional hit. Max 100 identifiers.

check_identifiers input schema
{
  "type": "object",
  "required": [
    "identifiers"
  ],
  "properties": {
    "identifiers": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 200,
        "minLength": 1
      },
      "maxItems": 100,
      "minItems": 1,
      "description": "Identifiers as they appear in code"
    }
  },
  "additionalProperties": false
}
check_identifiers output schema
{
  "type": "object",
  "required": [
    "results",
    "records",
    "truncated",
    "record_urls",
    "next_step"
  ],
  "properties": {
    "records": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "vendor",
          "severity",
          "kind",
          "surface",
          "effective",
          "date_passed",
          "summary",
          "fix_hint",
          "scope",
          "record_url",
          "source_url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "scope": {
            "type": "string",
            "description": "Empty when the record applies to every caller; otherwise where it applies"
          },
          "vendor": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "surface": {
            "type": "string"
          },
          "fix_hint": {
            "type": "string"
          },
          "severity": {
            "enum": [
              "breaking",
              "silent",
              "deprecation",
              "additive",
              "info"
            ],
            "type": "string"
          },
          "effective": {
            "type": "string",
            "description": "Key date, YYYY-MM-DD"
          },
          "record_url": {
            "type": "string"
          },
          "source_url": {
            "type": "string"
          },
          "date_passed": {
            "type": "boolean",
            "description": "True when the key date is today or earlier (UTC)"
          }
        }
      }
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "identifier",
          "answer",
          "found",
          "record_ids"
        ],
        "properties": {
          "found": {
            "type": "boolean"
          },
          "answer": {
            "type": "string"
          },
          "identifier": {
            "type": "string"
          },
          "record_ids": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      }
    },
    "next_step": {
      "type": "string"
    },
    "truncated": {
      "type": "boolean"
    },
    "record_urls": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}
check_identifiers annotations
{
  "title": "Check many identifiers",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_upcoming — List upcoming changes
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the dated changes in apiwatch's feed from today forward, soonest first: model retirements, breaking API changes, silent behavior changes and deprecation key dates. Use it to plan migrations. Optionally limit to the next N days (default 90, max 365) or one vendor. Max 50 records.

list_upcoming input schema
{
  "type": "object",
  "properties": {
    "days": {
      "type": "integer",
      "maximum": 365,
      "minimum": 1,
      "description": "How many days ahead, default 90"
    },
    "vendor": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "Only this vendor, for example OpenAI, Anthropic, Google, Stripe"
    }
  },
  "additionalProperties": false
}
list_upcoming output schema
{
  "type": "object",
  "required": [
    "from",
    "to",
    "vendor",
    "total",
    "truncated",
    "records",
    "record_urls",
    "next_step"
  ],
  "properties": {
    "to": {
      "type": "string"
    },
    "from": {
      "type": "string"
    },
    "total": {
      "type": "integer"
    },
    "vendor": {
      "type": "string"
    },
    "records": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "vendor",
          "severity",
          "kind",
          "surface",
          "effective",
          "date_passed",
          "summary",
          "fix_hint",
          "scope",
          "record_url",
          "source_url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "scope": {
            "type": "string",
            "description": "Empty when the record applies to every caller; otherwise where it applies"
          },
          "vendor": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "surface": {
            "type": "string"
          },
          "fix_hint": {
            "type": "string"
          },
          "severity": {
            "enum": [
              "breaking",
              "silent",
              "deprecation",
              "additive",
              "info"
            ],
            "type": "string"
          },
          "effective": {
            "type": "string",
            "description": "Key date, YYYY-MM-DD"
          },
          "record_url": {
            "type": "string"
          },
          "source_url": {
            "type": "string"
          },
          "date_passed": {
            "type": "boolean",
            "description": "True when the key date is today or earlier (UTC)"
          }
        }
      }
    },
    "next_step": {
      "type": "string"
    },
    "truncated": {
      "type": "boolean"
    },
    "record_urls": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}
list_upcoming annotations
{
  "title": "List upcoming changes",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
search_changes — Search changes
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search apiwatch's feed of reviewed vendor changes by text: a case-insensitive match on each record's summary, vendor and signatures (the strings to look for in code). Use it when you know a product or feature name but not the exact id. Newest key date first; default 20 results, max 50.

search_changes input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1,
      "description": "Default 20"
    },
    "query": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1
    },
    "vendor": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "Only this vendor, for example OpenAI, Anthropic, Google, Stripe"
    }
  },
  "additionalProperties": false
}
search_changes output schema
{
  "type": "object",
  "required": [
    "query",
    "vendor",
    "total",
    "truncated",
    "records",
    "record_urls",
    "next_step"
  ],
  "properties": {
    "query": {
      "type": "string"
    },
    "total": {
      "type": "integer"
    },
    "vendor": {
      "type": "string"
    },
    "records": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "vendor",
          "severity",
          "kind",
          "surface",
          "effective",
          "date_passed",
          "summary",
          "fix_hint",
          "scope",
          "record_url",
          "source_url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "scope": {
            "type": "string",
            "description": "Empty when the record applies to every caller; otherwise where it applies"
          },
          "vendor": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "surface": {
            "type": "string"
          },
          "fix_hint": {
            "type": "string"
          },
          "severity": {
            "enum": [
              "breaking",
              "silent",
              "deprecation",
              "additive",
              "info"
            ],
            "type": "string"
          },
          "effective": {
            "type": "string",
            "description": "Key date, YYYY-MM-DD"
          },
          "record_url": {
            "type": "string"
          },
          "source_url": {
            "type": "string"
          },
          "date_passed": {
            "type": "boolean",
            "description": "True when the key date is today or earlier (UTC)"
          }
        }
      }
    },
    "next_step": {
      "type": "string"
    },
    "truncated": {
      "type": "boolean"
    },
    "record_urls": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}
search_changes annotations
{
  "title": "Search changes",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_record — Get one record
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get one apiwatch record in full, as published: what changes, what to do, the strings to search for, ids it does not cover, where it applies, the vendor source and when it was reviewed. Use an id from another tool's result.

get_record input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "Record id, for example openai-2026-10-23-gpt-4o-2024-05-13"
    }
  },
  "additionalProperties": false
}
get_record output schema
{
  "type": "object",
  "required": [
    "found",
    "record_urls",
    "next_step"
  ],
  "properties": {
    "found": {
      "type": "boolean"
    },
    "record": {
      "type": "object",
      "required": [
        "id",
        "vendor",
        "severity",
        "kind",
        "surface",
        "effective",
        "date_passed",
        "summary",
        "fix_hint",
        "scope",
        "record_url",
        "source_url",
        "detail",
        "signatures",
        "exclude",
        "context",
        "files",
        "repo_context",
        "verified_on",
        "review"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "kind": {
          "type": "string"
        },
        "files": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "scope": {
          "type": "string",
          "description": "Empty when the record applies to every caller; otherwise where it applies"
        },
        "detail": {
          "type": "string"
        },
        "review": {
          "type": "string"
        },
        "vendor": {
          "type": "string"
        },
        "context": {
          "type": "array"
        },
        "exclude": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Ids the signatures would also match that this change does not cover"
        },
        "summary": {
          "type": "string"
        },
        "surface": {
          "type": "string"
        },
        "fix_hint": {
          "type": "string"
        },
        "severity": {
          "enum": [
            "breaking",
            "silent",
            "deprecation",
            "additive",
            "info"
          ],
          "type": "string"
        },
        "effective": {
          "type": "string",
          "description": "Key date, YYYY-MM-DD"
        },
        "record_url": {
          "type": "string"
        },
        "signatures": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "source_url": {
          "type": "string"
        },
        "date_passed": {
          "type": "boolean",
          "description": "True when the key date is today or earlier (UTC)"
        },
        "verified_on": {
          "type": "string"
        },
        "repo_context": {
          "type": "array"
        }
      }
    },
    "next_step": {
      "type": "string"
    },
    "record_urls": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}
get_record annotations
{
  "title": "Get one record",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_watched_mcp_servers — List watched MCP servers
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the public MCP servers whose tools apiwatch checks every 6 hours (tools/list only, no login, no tool calls), with each one's status (answering, needs a login, not reachable), tool count, last check and last observed change. Use it to see which servers mcp_server_changes can answer about. Returns no tool descriptions.

list_watched_mcp_servers input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
list_watched_mcp_servers output schema
{
  "type": "object",
  "required": [
    "servers",
    "total",
    "note",
    "index_url"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "total": {
      "type": "integer"
    },
    "servers": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "slug",
          "name",
          "url",
          "registry_name",
          "status",
          "status_since",
          "tool_count",
          "last_checked",
          "first_seen",
          "last_change",
          "changes_total",
          "open_flags",
          "page_url"
        ],
        "properties": {
          "url": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "status": {
            "enum": [
              "pending_first_check",
              "ok",
              "needs_login",
              "not_reachable",
              "empty_tools",
              "failing"
            ],
            "type": "string"
          },
          "page_url": {
            "type": "string"
          },
          "first_seen": {
            "type": "string"
          },
          "open_flags": {
            "type": "array",
            "items": {
              "enum": [
                "description_changed",
                "annotation_widened",
                "hidden_characters",
                "instruction_like_text",
                "unusual_tool_name"
              ],
              "type": "string"
            },
            "description": "Flags from the last 30 days"
          },
          "tool_count": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Tools at the last good check; null before the first one"
          },
          "last_change": {
            "type": "string"
          },
          "last_checked": {
            "type": "string"
          },
          "status_since": {
            "type": "string"
          },
          "changes_total": {
            "type": "integer"
          },
          "registry_name": {
            "type": "string"
          }
        }
      }
    },
    "index_url": {
      "type": "string"
    }
  }
}
list_watched_mcp_servers annotations
{
  "title": "List watched MCP servers",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
mcp_server_changes — Recent tool changes on an MCP server
Advertised by the server during the last successful anonymous check.
Advertised read-only

Before you rely on a public MCP server's tools, ask whether apiwatch saw them change: tools removed or renamed, new required parameters, rewritten descriptions, changed safety hints. Give a watched server's slug, URL or registry name. Returns a one line answer and the confirmed changes in the last N days (default 90, max 365), newest first, with flags worth a look. Observations only: no changes is not a statement that a server is safe. Never includes tool description text.

mcp_server_changes input schema
{
  "type": "object",
  "required": [
    "server"
  ],
  "properties": {
    "days": {
      "type": "integer",
      "maximum": 365,
      "minimum": 1,
      "description": "How many days back, default 90"
    },
    "server": {
      "type": "string",
      "maxLength": 300,
      "minLength": 1,
      "description": "Slug (context7), URL (https://mcp.context7.com/mcp) or registry name"
    }
  },
  "additionalProperties": false
}
mcp_server_changes output schema
{
  "type": "object",
  "required": [
    "query",
    "watched",
    "days",
    "from",
    "to",
    "answer",
    "server",
    "changes",
    "notes",
    "truncated",
    "index_url"
  ],
  "properties": {
    "to": {
      "type": "string"
    },
    "days": {
      "type": "integer"
    },
    "from": {
      "type": "string"
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "date",
          "kind"
        ],
        "properties": {
          "date": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          }
        }
      }
    },
    "query": {
      "type": "string"
    },
    "answer": {
      "type": "string"
    },
    "server": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "url": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "slug": {
          "type": "string"
        },
        "status": {
          "enum": [
            "pending_first_check",
            "ok",
            "needs_login",
            "not_reachable",
            "empty_tools",
            "failing"
          ],
          "type": "string"
        },
        "page_url": {
          "type": "string"
        },
        "first_seen": {
          "type": "string"
        },
        "open_flags": {
          "type": "array",
          "items": {
            "enum": [
              "description_changed",
              "annotation_widened",
              "hidden_characters",
              "instruction_like_text",
              "unusual_tool_name"
            ],
            "type": "string"
          },
          "description": "Flags from the last 30 days"
        },
        "tool_count": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Tools at the last good check; null before the first one"
        },
        "last_change": {
          "type": "string"
        },
        "last_checked": {
          "type": "string"
        },
        "status_since": {
          "type": "string"
        },
        "changes_total": {
          "type": "integer"
        },
        "registry_name": {
          "type": "string"
        }
      }
    },
    "changes": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "date",
          "events",
          "flags",
          "truncated"
        ],
        "properties": {
          "date": {
            "type": "string"
          },
          "flags": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "flag",
                "tool",
                "detail"
              ],
              "properties": {
                "flag": {
                  "enum": [
                    "description_changed",
                    "annotation_widened",
                    "hidden_characters",
                    "instruction_like_text",
                    "unusual_tool_name"
                  ],
                  "type": "string"
                },
                "tool": {
                  "type": "string"
                },
                "detail": {
                  "type": "string"
                }
              }
            }
          },
          "events": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "type",
                "tool",
                "path",
                "severity"
              ],
              "properties": {
                "path": {
                  "type": "string"
                },
                "tool": {
                  "type": "string",
                  "description": "Tool name, or sha256:<hex> when the name is not plain"
                },
                "type": {
                  "type": "string"
                },
                "severity": {
                  "enum": [
                    "breaking",
                    "silent",
                    "deprecation",
                    "additive",
                    "info"
                  ],
                  "type": "string"
                }
              }
            }
          },
          "truncated": {
            "type": "boolean"
          }
        }
      }
    },
    "watched": {
      "type": "boolean"
    },
    "index_url": {
      "type": "string"
    },
    "truncated": {
      "type": "boolean"
    }
  }
}
mcp_server_changes annotations
{
  "title": "Recent tool changes on an MCP server",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

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

Maintenance history

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

  • · probe · passed · 393 ms · metadata changed · 7 tool(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 apiwatch-mcp https://apiwatch.reignventures.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 apiwatch-mcp --url https://apiwatch.reignventures.co/mcp

Cursor

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

Cline

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

VS Code

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

Let your agent find its tools

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