Skip to main content

MCP Callback Protocol extension for enabling asynchronous tool callbacks and streaming updates from MCP clients

Project description

MCPC - Model Context Protocol Callback

PyPI version License: MIT Python Versions

MCPC is an extension to MCP (Model-Context-Protocol) that solves a critical limitation in LLM tool interactions: enabling continued conversations while running tools background tasks. It facilitates asynchronous two-way communication between LLMs and tools through the already existing MCP transport - no additional transport layer needed, while maintaining full backward compatibility.

Conceptual demo of MCPC's continuous conversation flow between LLM and tools (UI not included)

What is MCPC?

MCPC is an extension to the MCP protocol, not a replacement. It builds upon the existing MCP infrastructure to add real-time two-way communication capabilities while maintaining full compatibility with standard MCP implementations.

MCPC solves a critical limitation in LLM tool interactions: enabling continuous two-way communication while running background tasks:

  • Bidirectional communication between LLMs and tools using the same MCP transport
  • Continuous conversation with LLMs during tool execution
  • Real-time updates from background processes
  • Asynchronous notifications when operations complete
  • Support for indefinitely running tasks with streaming updates

Compatibility Matrix

Features

Feature Status Notes
STDIO Transport ✅ Implemented Full support for standard input/output transport
SSE Transport ⚠️ Limited Support Standard MCP operations only, MCPC features pending
MCPC Client → Standard MCP Server ✅ Implemented Full backward compatibility
Standard MCP Client → MCPC Server ✅ Implemented Automatic fallback to synchronous results

Frameworks

Framework Status Notes
FastMCP 😎 ✅ Implemented Recommended
Standard MCP SDK Server ✅ Implemented Works (Use FastMCP if you can)

Quick Installation

# With UV (recommended)
uv add mcpc

# With pip
pip install mcpc

Basic Client Usage

# Initialize the MCPC handler
mcpc_handler = MCPCHandler("my-provider")

# Define your event listener function
async def my_mcpc_listener(mcpc_message: MCPCMessage) -> None:
    print(f"Received MCPC message: {mcpc_message}")
    # Handle the message based on status
    if mcpc_message.type == "task" and mcpc_message.event == "complete":
        print(f"Task {mcpc_message.task_id} completed with result: {mcpc_message.result}")

# Add your event listener for MCPC Message
mcpc_handler.add_event_listener(my_mcpc_listener)

# Wrap the transport with MCPC event listeners
wrapped_transport = await mcpc_handler.wrap_streams(*transport)

# Create a ClientSession with the wrapped transport
session = await ClientSession(*wrapped_transport)

# Initialize MCPC features by checking for MCPC support
mcpc_supported = await mcpc_handler.init_mcpc(session)
if mcpc_supported:
    print(f"MCPC protocol v{mcpc_handler.protocol_version} supported")

Basic Server Usage - FastMCP

# Initialize MCPC helper
server = FastMCP("my-provider")
mcpc = MCPCHelper(server)

@server.tool()
def process_data(url: str) -> dict:
    async def process_data_task():
        await mcpc.send(mcpc.create_task_event(
            event="update",
            tool_name="process_data",
            session_id=session_id,
            task_id=task_id,
            result=f"Processing {url}..."
        ))
        await asyncio.sleep(3) # Simulate processing time
        await mcpc.send(mcpc.create_task_event(
            event="complete",
            tool_name="process_data",
            session_id=session_id,
            task_id=task_id,
            result={
                YOUR_DATA_OBJECT
            }
        ))

    # Start a background task - or run synchronous if no MCPC support
    collected_messages = mcpc.start_task(task_id, process_data_task)

    # For standard MCP clients, return collected complete/failed messages
    if collected_messages:
        # Keep in mind that FastMCP differs from Standard MCP
        # by expecting direct result rather than TextContent
        # It has implications in that it returns
        # all messages as "one" item, rather than multiple
        return collected_messages

    # For MCPC clients, return immediate acknowledgment
    # See comment above on why this is not [TextContent]
    return mcpc.create_task_event(
        event="created",
        tool_name="process_data",
        session_id=session_id,
        task_id=task_id,
        result=f"Started processing data_id={data_id}. Updates will stream in real-time."
    )

if __name__ == "__main__":
    asyncio.run(server.run())

Documentation

For detailed documentation, please see:

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mcpc-0.2.5.tar.gz (115.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mcpc-0.2.5-py3-none-any.whl (11.4 kB view details)

Uploaded Python 3

File details

Details for the file mcpc-0.2.5.tar.gz.

File metadata

  • Download URL: mcpc-0.2.5.tar.gz
  • Upload date:
  • Size: 115.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for mcpc-0.2.5.tar.gz
Algorithm Hash digest
SHA256 0c3bae3290d97d470fac33a5ed2e8aa9230f82e8262fe2805b9fd3ac45f17754
MD5 3b5957c120c0579105caf2ce2cb6438d
BLAKE2b-256 6315791b48c442038ea188fcce1b14b83372ee86d92f3645e53e788c69650823

See more details on using hashes here.

Provenance

The following attestation bundles were made for mcpc-0.2.5.tar.gz:

Publisher: python-publish.yml on OlaHulleberg/mcpc

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mcpc-0.2.5-py3-none-any.whl.

File metadata

  • Download URL: mcpc-0.2.5-py3-none-any.whl
  • Upload date:
  • Size: 11.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for mcpc-0.2.5-py3-none-any.whl
Algorithm Hash digest
SHA256 2d279fcacc0b7d6910d0f5bff978e1be729bcb0c6bee8649cce211a9bdf83d4a
MD5 6720d820d8678b98ca4bea22c067113b
BLAKE2b-256 4647be8f01895d32a97e877c65ec39c974afe4da0a51e234a6d83d2679ab3f75

See more details on using hashes here.

Provenance

The following attestation bundles were made for mcpc-0.2.5-py3-none-any.whl:

Publisher: python-publish.yml on OlaHulleberg/mcpc

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page