MCP Task Proxy

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.

Category
Visit Server

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, and tasks/cancel;
  • returns io.modelcontextprotocol/related-task metadata 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 working until 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

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.

Official
Featured
TypeScript
Magic Component Platform (MCP)

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.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

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.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

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.

Official
Featured
TypeScript
Kagi MCP Server

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.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

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.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured