For agents and integrators

Connect your AI to migratelms.com.

Pick the section for the client you use. Each one is a single copy-paste; nothing to install, no auth to configure. The same four tools (get_migration_quote, create_checkout_session, list_migration_paths, get_status) show up in every client.

MCP CLIENT

Claude Desktop

Open ~/Library/Application Support/Claude/claude_desktop_config.json (or the equivalent on Windows / Linux) and merge in:

{
  "mcpServers": {
    "migratelms": {
      "url": "https://migratelms.com/api/mcp"
    }
  }
}

Restart Claude Desktop. The four migratelms tools register as a new MCP server. Ask Claude "what migrations do you support?" to verify.

MCP CLIENT

Claude Code

One-line install:

claude mcp add --transport http migratelms https://migratelms.com/api/mcp

Then /mcp in any Claude Code session lists the registered tools.

MCP CLIENT

Cursor

Cursor → Settings → Cursor Settings → MCP → Add new MCP server. Or edit ~/.cursor/mcp.json directly:

{
  "mcpServers": {
    "migratelms": {
      "url": "https://migratelms.com/api/mcp"
    }
  }
}

Reopen Cursor; the tools appear in the MCP panel.

MCP CLIENT

Continue (VS Code / JetBrains)

Add to ~/.continue/config.json:

{
  "experimental": {
    "modelContextProtocolServers": [
      {
        "transport": {
          "type": "http",
          "url": "https://migratelms.com/api/mcp"
        }
      }
    ]
  }
}
MCP CLIENT

Zed

Add to your Zed settings.json via Cmd-, → Open JSON:

{
  "context_servers": {
    "migratelms": {
      "command": null,
      "url": "https://migratelms.com/api/mcp"
    }
  }
}
OPENAPI · FOR PRO USERS

ChatGPT (Custom GPT)

ChatGPT doesn't speak MCP yet. The native path is a Custom GPT with Actions. Build a new GPT in the GPT Builder and import the OpenAPI:

https://migratelms.com/openapi.json

In the GPT Builder, choose Configure → Actions → Import from URL, paste the URL above, save. Auth: None. The four endpoints register as callable actions.

FUNCTION DECLARATIONS

Gemini API / Vertex AI

Gemini doesn't auto-discover, but the function-declarations file registers all four tools in one fetch. Python:

import json, urllib.request
from google import genai
from google.genai import types

with urllib.request.urlopen("https://migratelms.com/.well-known/gemini-tools.json") as r:
    spec = json.load(r)

client = genai.Client()
response = client.models.generate_content(
    model="gemini-2.0-flash",
    contents="Quote a Thinkific to LearnDash migration with 12 courses, 300 videos, 2000 users.",
    config=types.GenerateContentConfig(
        tools=[types.Tool(function_declarations=spec["function_declarations"])]
    ),
)

For AI Studio's UI: Tools → Function Calling → paste the contents of /.well-known/gemini-tools.json into the function declarations field.

VERIFY

Test the connection from a terminal

Want to confirm the MCP endpoint is alive before wiring anything? Hit it with curl:

curl -X POST https://migratelms.com/api/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

You should see a JSON-RPC response listing the four tools and their schemas. If you see anything else, the issue is client-side, not server-side — the endpoint is stateless and always reachable.

What does "connect" actually do?

Once connected, your agent can call our REST API as if it were a built-in tool. A user can ask "Get me a quote for migrating 12 Thinkific courses to LearnDash, 300 videos, 2000 users." The agent calls get_migration_quote, returns a tier and price range, and offers to call create_checkout_session if the user wants to proceed. The agent surfaces the Stripe URL for the user to click. We invoice like normal and email the post-sale intake link from the same flow a human visitor would hit at /contact. No human in the loop on our side; no scraping on yours.

The full surface inventory and constraint list lives at /agents.txt. Tooling-specific issues: hello@migratelms.com.