82 lines
1.9 KiB
Markdown
82 lines
1.9 KiB
Markdown
---
|
|
title: Namespace transform does not rewrite ResourceLink URIs returned from proxied tools
|
|
---
|
|
|
|
## summary
|
|
|
|
With a `Namespace` transform on a proxy, listed resources are namespaced
|
|
correctly.
|
|
However, `ResourceLink.uri` values returned from a proxied
|
|
`tools/call` result keep the upstream URI instead of the proxied URI.
|
|
|
|
Tested on FastMCP `3.3.0`.
|
|
|
|
## minimal example
|
|
|
|
```python
|
|
from fastmcp.server import create_proxy
|
|
from fastmcp.server.transforms import Namespace
|
|
|
|
proxy = create_proxy(upstream_client, name="Proxy-everything")
|
|
proxy.add_transform(Namespace("everything"))
|
|
```
|
|
|
|
An upstream resource looking like this:
|
|
|
|
```text
|
|
demo://resource/dynamic/text/2
|
|
```
|
|
|
|
will be exposed correctly as:
|
|
|
|
```text
|
|
demo://everything/resource/dynamic/text/2
|
|
```
|
|
|
|
But if an upstream tool returns:
|
|
|
|
```python
|
|
mcp.types.ResourceLink(
|
|
type="resource_link",
|
|
name="dynamic-text",
|
|
uri="demo://resource/dynamic/text/2",
|
|
)
|
|
```
|
|
|
|
the proxied tool result still contains:
|
|
|
|
```text
|
|
demo://resource/dynamic/text/2
|
|
```
|
|
|
|
## Observed Behavior
|
|
|
|
```text
|
|
resources/list:
|
|
upstream: demo://resource/dynamic/text/2
|
|
proxied: demo://everything/resource/dynamic/text/2
|
|
|
|
resources/read:
|
|
demo://everything/resource/dynamic/text/2
|
|
-> works
|
|
|
|
tools/call result content:
|
|
ResourceLink.uri == demo://resource/dynamic/text/2
|
|
-> raw upstream URI leaks through unchanged
|
|
```
|
|
|
|
## expected behavior
|
|
|
|
`ResourceLink` content returned by proxied tools should expose the same proxied
|
|
URI as `resources/list` and `resources/read`.
|
|
|
|
## scope of this issue
|
|
|
|
This is specifically about `mcp.types.ResourceLink` content inside `tools/call`
|
|
results. Normal `resources/list`, `resource_templates/list`, and
|
|
`resources/read` already behave correctly through the proxy.
|
|
|
|
Session-scoped resources returned by some tools may have additional lifecycle
|
|
constraints beyond URI rewriting. This issue is about ordinary ResourceLink URI
|
|
projection only.
|