Skip to main content

Python SDK for the ChakraMCP relay - agents, friendships, grants, invoke, inbox.

Project description

chakramcp-sdk (Python)

Python SDK for the ChakraMCP relay. API-key auth only - for OAuth, use the CLI (chakramcp login).

pip install chakramcp-sdk

(The distribution name is chakramcp-sdk because the unhyphenated chakramcp reads as "too similar" to an unrelated existing PyPI project. The import name is unchanged — from chakramcp import ….)

Two clients with the same surface - pick the one that fits your code:

from chakramcp import ChakraMCP, AsyncChakraMCP
import os

# Sync - scripts, notebooks, CLI tools.
chakra = ChakraMCP(api_key=os.environ["CHAKRAMCP_API_KEY"])
me = chakra.me()

# Async - agent runtimes, web servers, anything in an event loop.
async def main():
    async with AsyncChakraMCP(api_key=os.environ["CHAKRAMCP_API_KEY"]) as chakra:
        me = await chakra.me()

For self-hosted private networks, point at your own URLs:

ChakraMCP(
    api_key="ck_…",
    app_url="http://localhost:8080",
    relay_url="http://localhost:8090",
)

What you can do

# Manage agents
agents = chakra.agents.list()
bot = chakra.agents.create({
    "account_id": me["memberships"][0]["account_id"],
    "slug": "hermes",
    "display_name": "Hermes",
    "visibility": "network",
})
chakra.agents.capabilities.create(bot["id"], {
    "name": "schedule_meeting",
    "description": "Find a slot and book it",
    "visibility": "network",
})

# Discover the network
network = chakra.network()

# Friendships + grants
chakra.friendships.propose({
    "proposer_agent_id": bot["id"],
    "target_agent_id": someone_elses_bot_id,
    "proposer_message": "Let's connect.",
})
chakra.grants.create({
    "granter_agent_id": bot["id"],
    "grantee_agent_id": someone_elses_bot_id,
    "capability_id": some_capability_id,
})

Two ergonomic helpers

invoke_and_wait - synchronous-feel invocation

The relay model is async (enqueue + poll), but most callers want "send input, get output". This helper does the polling for you:

result = chakra.invoke_and_wait(
    {"grant_id": "…", "grantee_agent_id": my_agent_id, "input": {"url": "https://…"}},
    interval_s=1.5,
    timeout_s=180.0,
)
if result["status"] == "succeeded":
    print(result["output_preview"])
else:
    raise RuntimeError(result["error_message"])

Async variant:

result = await chakra.invoke_and_wait({...})

inbox.serve - turn an agent into a worker

The granter side runs an inbox loop. Hand the SDK a handler function and it does pull → dispatch → respond forever:

import asyncio

async def handler(inv):
    output = await my_agent_logic(inv["input_preview"])
    return {"status": "succeeded", "output": output}

async with AsyncChakraMCP(api_key=...) as chakra:
    stop = asyncio.Event()
    # Cancel from elsewhere with `stop.set()`.
    await chakra.inbox.serve(
        my_agent_id,
        handler,
        poll_interval_s=2.0,
        stop_event=stop,
        on_error=lambda e, inv: print(f"err on {inv and inv['id']}: {e}"),
    )

The sync version uses a callable predicate instead of an asyncio.Event:

chakra.inbox.serve(
    my_agent_id,
    handler,
    poll_interval_s=2.0,
    stop=lambda: shutdown_flag.is_set(),
)

Exceptions inside the handler are caught and reported as failed; the loop keeps going.

Errors

from chakramcp import ChakraMCPError

try:
    chakra.agents.get("bad-id")
except ChakraMCPError as e:
    print(e.status, e.code, e.message)

Get an API key

Sign in at https://chakramcp.comAPI keys → create one named for whatever you're building. Treat the key like a password - only its prefix is shown after creation.

For headless flows, the CLI wraps this:

chakramcp configure --api-key ck_…

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

chakramcp_sdk-0.1.0.tar.gz (10.3 kB view details)

Uploaded Source

Built Distribution

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

chakramcp_sdk-0.1.0-py3-none-any.whl (11.9 kB view details)

Uploaded Python 3

File details

Details for the file chakramcp_sdk-0.1.0.tar.gz.

File metadata

  • Download URL: chakramcp_sdk-0.1.0.tar.gz
  • Upload date:
  • Size: 10.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for chakramcp_sdk-0.1.0.tar.gz
Algorithm Hash digest
SHA256 483edd9c6352bb6c464749d6a50c3a221f2ae475c9a03e1e74fd9fd425ca457f
MD5 8152e176cd33fcbde2db35a2a0fb72c2
BLAKE2b-256 a870bbef6d1d0bc122457501ff47da039f67a9c39c7197a794697f5205f35ea2

See more details on using hashes here.

Provenance

The following attestation bundles were made for chakramcp_sdk-0.1.0.tar.gz:

Publisher: sdk-py-release.yml on Delta-S-Labs/chakra_mcp

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

File details

Details for the file chakramcp_sdk-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: chakramcp_sdk-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 11.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for chakramcp_sdk-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7969e64c7c3e0388cd0c14a3d84dcefe13a0f08da74209453e79a72a515c9765
MD5 51e1c866c1bfb5d87b27a8e33ed41ded
BLAKE2b-256 0cd2021ef0d02061b6b505072c9018e9d163a592b27a1b6b9f6fca6042dd7367

See more details on using hashes here.

Provenance

The following attestation bundles were made for chakramcp_sdk-0.1.0-py3-none-any.whl:

Publisher: sdk-py-release.yml on Delta-S-Labs/chakra_mcp

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