Metadata-Version: 2.4
Name: mcp-relay-core
Version: 1.3.1
Summary: Zero-env-config credential relay for MCP servers
Project-URL: Homepage, https://github.com/n24q02m/mcp-relay-core
Project-URL: Repository, https://github.com/n24q02m/mcp-relay-core
Project-URL: Issues, https://github.com/n24q02m/mcp-relay-core/issues
Author-email: n24q02m <quangminh2422004@gmail.com>
License: MIT
Keywords: aes-256-gcm,credentials,e2e,ecdh,encryption,mcp,relay
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Security :: Cryptography
Classifier: Topic :: Software Development :: Libraries
Requires-Python: ==3.13.*
Requires-Dist: cryptography>=46.0.5
Requires-Dist: httpx>=0.27
Requires-Dist: platformdirs>=4.3
Description-Content-Type: text/markdown

# mcp-relay-core

Zero-config credential relay client for Python MCP servers -- ECDH P-256 + AES-256-GCM E2E encryption.

## Installation

```bash
pip install mcp-relay-core
```

## Usage

### Resolve config (env vars -> config file -> defaults -> relay)

```python
from mcp_relay_core import resolve_config

result = resolve_config("my-server", ["api_key", "endpoint"])

if result.config:
    print(f"Config loaded from {result.source}: {result.config}")
else:
    # No config found -- trigger relay setup
    pass
```

### Relay session (interactive credential setup)

```python
import asyncio
from mcp_relay_core import create_session, poll_for_result, write_config

async def setup():
    session = await create_session(
        "https://relay.example.com",
        "my-server",
        {
            "fields": [
                {"name": "api_key", "label": "API Key", "type": "password"},
                {"name": "endpoint", "label": "Endpoint", "type": "text"},
            ]
        },
    )

    print(f"Open this URL to enter credentials: {session.relay_url}")

    credentials = await poll_for_result("https://relay.example.com", session)
    write_config("my-server", credentials)

asyncio.run(setup())
```

### Crypto primitives

```python
from mcp_relay_core import (
    generate_key_pair,
    export_public_key,
    derive_shared_secret,
    derive_aes_key,
    encrypt,
    decrypt,
)
```

## Documentation

See the [main repository](https://github.com/n24q02m/mcp-relay-core) for full documentation, architecture, and security properties.

## License

MIT
