MCP Task Proxy
Proxies a remote MCP server to add protocol-native background task support, including task management and progress forwarding, while preserving synchronous calls.
README
MCP Task Proxy
MCP Task Proxy wraps tools from a remote MCP server with protocol-native background task support. The upstream server does not need to implement MCP tasks.
Container image: ghcr.io/karpikpl/mcp-task-proxy:latest
The proxy:
- mirrors upstream tool names, descriptions, schemas, annotations, and results;
- advertises each tool with
execution.taskSupport: "optional"; - runs task-augmented calls in its own background worker;
- exposes
tasks/get,tasks/result,tasks/list, andtasks/cancel; - returns
io.modelcontextprotocol/related-taskmetadata with final results; - forwards upstream progress notifications into task status updates; and
- continues to support ordinary synchronous tool calls.
Configuration
| Variable | Required | Default | Description |
|---|---|---|---|
UPSTREAM_MCP_URL |
Yes | — | Streamable HTTP endpoint of the source MCP server |
UPSTREAM_MCP_HEADERS |
No | {} |
JSON object containing headers sent upstream |
UPSTREAM_FORWARD_HEADERS |
No | Authorization |
Comma-separated incoming headers to forward upstream |
HOST |
No | 0.0.0.0 |
Proxy listen address |
PORT |
No | 8080 |
Proxy listen port |
FASTMCP_DOCKET_URL |
No | memory:// |
Task backend; use Redis for persistence and scaling |
The default in-memory task backend is suitable for local development and a single server process. Use a shared Redis or Valkey endpoint for production:
export FASTMCP_DOCKET_URL=redis://redis:6379/0
Run locally
export UPSTREAM_MCP_URL=https://example.com/mcp
uv sync
uv run mcp-task-proxy
The proxy MCP endpoint is http://localhost:8080/mcp; health is available at
http://localhost:8080/health.
Docker
docker build -t mcp-task-proxy .
docker run --rm -p 8080:8080 \
-e UPSTREAM_MCP_URL=https://example.com/mcp \
mcp-task-proxy
To pass upstream headers:
docker run --rm -p 8080:8080 \
-e UPSTREAM_MCP_URL=https://example.com/mcp \
-e 'UPSTREAM_MCP_HEADERS={"Authorization":"Bearer token"}' \
mcp-task-proxy
Client behavior
Task-aware clients can request background execution:
import asyncio
from fastmcp import Client
async def main() -> None:
async with Client("http://localhost:8080/mcp") as client:
task = await client.call_tool(
"slow_upstream_tool",
{"value": "example"},
task=True,
)
print(task.task_id)
print(await task.result())
asyncio.run(main())
Clients that do not augment the call with task metadata receive the upstream result synchronously.
The proxy forwards the incoming Authorization header during authenticated
tool discovery, synchronous calls, and background task execution. Forwarding is
restricted to UPSTREAM_FORWARD_HEADERS; request headers override matching
static values in UPSTREAM_MCP_HEADERS. The proxy relays credentials but does
not validate them itself.
For OAuth-capable upstream servers, the proxy exposes RFC 9728 metadata at
/.well-known/oauth-protected-resource and
/.well-known/oauth-protected-resource/mcp. It retrieves the path-aware
metadata document from the upstream server, preserves its authorization servers
and scopes, and rewrites resource to the proxy's public /mcp URL. For
Databricks Genie One, this preserves the required genie and offline_access
scopes and the workspace /oidc authorization server.
Upstream tools are discovered and cached on the first authenticated client request. Restart the proxy after the upstream adds, removes, or changes tools.
Limitations
- The proxy can report real progress only when the upstream sends MCP progress
notifications. Otherwise task status remains
workinguntil completion. - Cancellation stops the proxy task cooperatively but cannot guarantee that the upstream operation stops.
- In-memory tasks are lost when the proxy restarts and cannot be shared across replicas.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.