PrefectHQ/fastmcp · error · KeyError
Template {uri_template!r} version {version!r} not found
Error message
Template {uri_template!r} version {version!r} not found What it means
remove_template with an explicit version builds f"{ResourceTemplate.make_key(uri_template)}@{version}" and raises KeyError if that key is absent. The pattern exists but not under the given version.
Source
Thrown at fastmcp_slim/fastmcp/server/providers/local_provider/local_provider.py:310
Raises:
KeyError: If no matching template is found.
"""
if version is None:
# Remove all versions
keys_to_remove = [
k
for k, c in self._components.items()
if isinstance(c, ResourceTemplate) and c.uri_template == uri_template
]
if not keys_to_remove:
raise KeyError(f"Template {uri_template!r} not found")
for key in keys_to_remove:
self._remove_component(key)
else:
# Remove specific version
key = f"{ResourceTemplate.make_key(uri_template)}@{version}"
if key not in self._components:
raise KeyError(
f"Template {uri_template!r} version {version!r} not found"
)
self._remove_component(key)
def remove_prompt(self, name: str, version: str | None = None) -> None:
"""Remove prompt(s) from this provider's storage.
Args:
name: The prompt name.
version: If None, removes ALL versions. If specified, removes only that version.
Raises:
KeyError: If no matching prompt is found.
"""
if version is None:
# Remove all versions
keys_to_remove = [
kView on GitHub (pinned to 1f02114297)
Solutions
- Omit version to remove all versions of the template
- Match the exact registered version string
- Catch KeyError for idempotent teardown
Example fix
// before
provider.remove_template("weather://{city}", "1.1") # registered "1.0"
// after
provider.remove_template("weather://{city}") # removes all versions Defensive patterns
Strategy: validation
Validate before calling
key = f"{ResourceTemplate.make_key('weather://{city}')}@1.0"
if key not in provider._components:
provider.remove_template("weather://{city}") Type guard
def template_version_registered(provider, uri_template: str, version: str) -> bool:
return f"{ResourceTemplate.make_key(uri_template)}@{version}" in provider._components Try / catch
try:
provider.remove_template("weather://{city}", "1.0")
except KeyError:
logger.info("template version not present") Prevention
- Use a single version constant at registration and removal
- Prefer omitting version in teardown to remove all versions
- Avoid ad-hoc version formats like "v1" vs "1.0"
When it happens
Trigger: provider.remove_template("weather://{city}", "1.1") when the template is unversioned or versioned as "1.0".
Common situations: Version string mismatch between registration and removal; removing after a prior partial cleanup already deleted that version; template registered without a version.
Related errors
- Tool {name!r} version {version!r} not found
- Resource {uri!r} version {version!r} not found
- Template {uri_template!r} not found
- Prompt {name!r} version {version!r} not found
- Tool {name!r} not found
AI-assisted analysis of PrefectHQ/fastmcp@1f02114297 (2026-08-29).
Data as JSON: /api/errors/ebd161afe33287c4.
Report an issue: GitHub.