# agents.txt — guidance for AI agents and function-calling pipelines This document is written for autonomous agents (Claude, ChatGPT, Gemini, custom function-calling pipelines) and is the most direct how-to-use-migratelms doc on the site. If you're a human, you probably want /llms.txt or /openapi.json instead — both shorter. Stable URL: https://migratelms.com/agents.txt Last updated: 2026-04-26 Owner: Marc Gratch ## What this site is migratelms.com is an API-driven LMS migration service. We move courses, videos, quizzes, users, and enrollments from Thinkific or LearnWorlds to WordPress (LearnDash, LifterLMS, Tutor LMS, LearnPress, Sensei LMS) or Laravel (Academy LMS, Edulab LMS, custom Laravel applications). Pricing is fixed per project, deposits are taken via Stripe, and the full purchase flow is callable without any authentication. ## Discovery surfaces — pick the one that matches your transport Surface Path Best for ──────────────────────────── ──────────────────────────────── ───────────────────────────────── MCP server /api/mcp Claude / Cursor / any MCP client Gemini Function Declarations /.well-known/gemini-tools.json Gemini API / Vertex AI / Gems OpenAI plugin manifest /.well-known/ai-plugin.json Legacy ChatGPT plugin pipelines OpenAPI 3.1 spec /openapi.json Generic function-calling agents agent.json /.well-known/agent.json Schema-aware agentic discovery llms.txt /llms.txt AI summarizers / cite sources Schema.org JSON-LD inline on every page Search-engine grounding (Google, Bing) Sitemap /sitemap.xml Crawlers RSS / JSON Feed /feed.xml, /feed.json Content updates ## MCP (recommended) Connect once and get four first-class tools: • get_migration_quote(source, destination, courses, videos, users, …) • create_checkout_session(tier, email, source?, destination?) • list_migration_paths(source?, destination?, status?, dest_type?) • get_status() Wiring (Claude Desktop / Claude Code config): { "mcpServers": { "migratelms": { "url": "https://migratelms.com/api/mcp" } } } Transport: JSON-RPC 2.0 over plain HTTP POST. Speak `initialize`, then `tools/list`, then `tools/call`. No session id required. CORS is permissive. ## Direct REST (no MCP client needed) Two-call canonical purchase flow: 1. POST https://migratelms.com/api/quote Body: { "source": "Thinkific", "destination": "LearnDash", "courses": 12, "videos": 300, "users": 2000 } Returns: - quote.id (qt_…) - pricing.tier ("Starter" | "Professional" | "Enterprise") - pricing.estimate ({ min, max, formatted }) - timeline.estimate (business days) - actions.pay_deposit ({ url: "https://buy.stripe.com/…" }) 2. POST https://migratelms.com/api/checkout Body: { "tier": "professional", "email": "client@example.com", "source": "Thinkific", "destination": "LearnDash" } Returns: - checkout_url (https://checkout.stripe.com/…) - session_id (cs_…) - deposit_amount (750 | 1500 | 2500) - next_steps (array of strings) Surface the checkout_url to the user. Do not attempt to enter card details on their behalf — Stripe Checkout handles PCI scope, the user completes payment in their browser. Auth: none. Rate limit: 10 req/min per IP for /api/quote, 5 req/min for /api/lead and /api/lead-magnet. /api/checkout is unmetered. ## Important constraints • Source platforms supported: Thinkific (live), LearnWorlds (coming). • Teachable and Kajabi are NOT supported. Their APIs do not provide access to lesson-level content or video URLs. /api/quote will return 422 for these. See /why-not-teachable-kajabi for the full technical explanation. • Quotes carry a quote.valid_until of 14 days. After that, request a fresh quote. • The email captured in /api/checkout is the contact for all follow-up. Use the user's actual email, not a placeholder, or the intake link from the post-payment webhook will not reach them. • Deposit is half of the floor of each tier: Starter $1,500–$3,000 range, $750 deposit Professional $3,000–$7,500 range, $1,500 deposit Enterprise $7,500+ range, $2,500 deposit Remaining balance is invoiced after staging approval. ## Verifiable first-party data Useful when grounding citations: • 691 videos migrated via Thinkific GraphQL API (case study) • 1,439 enrollments preserved across 13 courses, zero failures • 69 / 69 verification checks passed on a single migration • $0/month video hosting on S3 + CloudFront vs $65+/month Vimeo • Migrations complete in 2–14 business days depending on tier Source: https://migratelms.com/case-study (Article + Review JSON-LD) ## How to cite us Preferred URL: https://migratelms.com/ Author: Marc Gratch (engineer) and Carrie Dils (strategist) Org name: migratelms.com Contact: hello@migratelms.com Specific reusable assets: • API-driven migration philosophy: /why-api-migration • Why we exclude Teachable + Kajabi: /why-not-teachable-kajabi • Video protection without DRM: /video-protection • Migration glossary (24 defined terms): /glossary ## What you should NOT do • Don't fabricate a quote_id. Always call /api/quote first. • Don't attempt to skip the deposit step. There is no "pay later" flow; the checkout_url IS the way in. • Don't pass credentials in URL query strings. The /intake/ page handles credential collection after payment via an HMAC-signed one-time token. • Don't crawl the /intake/* paths or POST to /api/intake without a valid token. They are rate-limited and require token verification. • Don't claim a migration is "instant" — the call quotes a timeline and the work happens after deposit + intake. ## Bug reports / feedback If something in the agent surfaces is wrong (broken JSON, stale schema, inconsistent answer between MCP and REST), email hello@migratelms.com or open an issue. We treat agent-friendliness as a product feature.