mastra-ai/mastra · error · Error

Registration failed with status ${response.status}: ${respon

Error message

Registration failed with status ${response.status}: ${response.statusText}

What it means

registerUser in packages/mcp-docs-server/src/tools/course.ts POSTs an email to the Mastra course registration API and throws `Registration failed with status ${status}: ${statusText}` when the HTTP response is not ok (response.ok false). The error surfaces non-2xx outcomes of the remote registration endpoint (rate limits, invalid email, server outages).

Source

Thrown at packages/mcp-docs-server/src/tools/course.ts:178

    req.on('error', error => {
      reject(error);
    });
    req.write(data);
    req.end();
  });
}

async function registerUser(email: string): Promise<{ success: boolean; id: string; key: string; message: string }> {
  const response = await fetch('https://mastra.ai/api/course/register', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ email }),
  });

  if (!response.ok) {
    throw new Error(`Registration failed with status ${response.status}: ${response.statusText}`);
  }

  return response.json() as Promise<{ success: boolean; id: string; key: string; message: string }>;
}

async function readCourseStep(lessonName: string, stepName: string, _isFirstStep: boolean = false): Promise<string> {
  // Find the lesson directory that matches the name
  const lessonDirs = await fs.readdir(courseDir);
  const lessonDir = lessonDirs.find(dir => dir.replace(/^\d+-/, '') === lessonName);

  if (!lessonDir) {
    throw new Error(`Lesson "${lessonName}" not found.`);
  }

  // Find the step file that matches the name
  const lessonPath = path.join(courseDir, lessonDir);
  const files = await fs.readdir(lessonPath);
  const stepFile = files.find(f => f.endsWith('.md') && f.replace(/^\d+-/, '').replace('.md', '') === stepName);

View on GitHub (pinned to 75dd419e61)

Solutions

  1. Read the status/statusText in the error: 4xx usually means fix the input (valid email), 429 means wait and retry, 5xx means retry later
  2. Verify the email address is valid and not already registered
  3. Retry with backoff for 429/5xx responses
  4. Check network/proxy connectivity to the course API endpoint

Example fix

// before
await registerUser({ email: 'not-an-email' }); // 400 -> Registration failed with status 400: Bad Request
// after
const email = 'dev@example.com';
if (!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email)) {
  throw new Error('Please provide a valid email address');
}
await registerUser({ email });
Defensive patterns

Strategy: retry

Validate before calling

const email = 'dev@example.com';
if (!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email)) {
  throw new Error('Invalid email: ' + email);
}

Type guard

null

Try / catch

try {
  await registerUser({ email });
} catch (e) {
  const m = String(e.message).match(/status (\d+)/);
  const status = m ? Number(m[1]) : 0;
  if (status === 429 || status >= 500) {
    // retry with backoff
  } else if (status >= 400) {
    console.error('Registration rejected — check the email address');
  } else throw e;
}

Prevention

When it happens

Trigger: Calling the course registration tool with an email when the remote endpoint returns 4xx/5xx — e.g. invalid email rejected, rate limiting (429), auth failure, or upstream 5xx.

Common situations: Typos or malformed emails; registering repeatedly and hitting rate limits; course API downtime or endpoint changes after a version update; corporate proxy/firewall blocking the request and the proxy returning an error status.

Understand the failure class

Background: 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause — this error's family across 28 libraries.

Related errors


AI-assisted analysis of mastra-ai/mastra@75dd419e61 (2026-08-30). Data as JSON: /api/errors/d7f8408bb8caeb1c. Report an issue: GitHub.