PrefectHQ/fastmcp · error · NotFoundError

Unknown prompt: {name!r}

Error message

Unknown prompt: {name!r}

What it means

FastMCP raises NotFoundError("Unknown prompt: {name!r}") from render_prompt when get_prompt returns None — no registered prompt matches the name (or it was disabled/filtered by transforms/middleware). This is the standard MCP 'not found' signal for prompts/get.

Source

Thrown at fastmcp_slim/fastmcp/server/server.py:1777

                        context.message.arguments,
                        version=version,
                        run_middleware=False,
                    ),
                )

            # Core logic: find and render prompt (providers queried in parallel)
            # Use get_prompt to apply transforms and filter disabled
            with server_span(
                f"prompts/get {name}",
                "prompts/get",
                self.name,
                "prompt",
                name,
                prompt_name=name,
            ) as span:
                prompt = await self.get_prompt(name, version=version)
                if prompt is None:
                    raise NotFoundError(f"Unknown prompt: {name!r}")
                span.set_attributes(prompt.get_span_attributes())
                try:
                    return await prompt._render(arguments)
                except FastMCPError as e:
                    logger.log(
                        e.log_level, f"Error rendering prompt {name!r}", exc_info=True
                    )
                    raise
                except MCPError:
                    logger.exception(f"Error rendering prompt {name!r}")
                    raise
                except Exception as e:
                    logger.exception(f"Error rendering prompt {name!r}")
                    if self._mask_error_details:
                        raise PromptError(f"Error rendering prompt {name!r}") from e
                    raise PromptError(f"Error rendering prompt {name!r}: {e}") from e

    def add_tool(self, tool: Tool | Callable[..., Any]) -> Tool:

View on GitHub (pinned to 1f02114297)

Solutions

  1. List available prompts (`await server.get_prompts()` / client.list_prompts) and use an exact registered name.
  2. Fix the name/typo in the caller.
  3. Register the prompt or re-enable it if it was disabled/removed by transforms.
  4. Check middleware that may be filtering prompts/get requests.

Example fix

// before
result = await client.get_prompt("sumarize_document")  # typo
// after
prompts = await client.list_prompts()
result = await client.get_prompt("summarize_document")
Defensive patterns

Strategy: validation

Validate before calling

names = {p.name for p in await client.list_prompts()}
if name not in names:
    raise ValueError(f"{name!r} not registered; available: {sorted(names)}")
result = await client.get_prompt(name)

Try / catch

try:
    result = await client.get_prompt(name, arguments=args)
except NotFoundError:
    print(f"Prompt {name!r} unknown — call client.list_prompts() to see registered names")

Prevention

When it happens

Trigger: `render_prompt(name)` or client.get_prompt(name) with a name that was never registered, a typo, a prompt removed/disabled, or a name filtered out by provider routing or middleware.

Common situations: Typo in prompt name; client connecting to a server that doesn't define the prompt; prompt removed after refactor; casing mismatch ('Summarize' vs 'summarize'); calling render before the decorator registration completes.

Related errors


AI-assisted analysis of PrefectHQ/fastmcp@1f02114297 (2026-08-29). Data as JSON: /api/errors/33d9a92bae58950c. Report an issue: GitHub.