Civic MCP Client
Python client library for connecting to the Civic MCP Hub with direct bearer token auth or RFC 8693 token exchange.
Install
uv sync
Install optional integration extras:
uv sync --extra pydanticai --extra langchain --extra fastmcp
Quick Start
from civic_mcp_client import CivicMCPClient
client = CivicMCPClient(
auth={"token": "your-civic-access-token"},
civic_profile="7c9e6679-7425-40de-944b-e07fc1f90ae7",
)
tools = await client.get_tools()
instructions = await client.get_server_instructions()
result = await client.call_tool(name="tool-name", args={"foo": "bar"})
await client.close()
Token Exchange (RFC 8693)
import os
from civic_mcp_client import CivicMCPClient
client = CivicMCPClient(
auth={
"token_exchange": {
"client_id": os.environ["CIVIC_CLIENT_ID"],
"client_secret": os.environ["CIVIC_CLIENT_SECRET"],
"subject_token": lambda: "external-token",
"expires_in": 3600, # optional requested lifetime in seconds
}
},
civic_profile="7c9e6679-7425-40de-944b-e07fc1f90ae7",
)
The token exchange manager provides:
- cache + expiry handling
- token change detection
- in-flight deduplication for concurrent calls
- expiry buffer of
min(30s, expires_in / 2)
Current access token can be retrieved via:
token = await client.get_access_token()
Testing
uv run --extra test python -m pytest
uv run --extra test python -m pytest -m integration
Manual Test Examples
Runnable scripts are available in examples/.
uv run python examples/direct_token.py
uv run python examples/token_exchange.py
uv run python examples/langchain_adapter.py
uv run python examples/pydanticai_adapter.py
uv run python examples/fastmcp_backend.py
To load environment variables from a .env file:
uv sync --extra examples
cp .env.example .env
uv run python -m dotenv run -- python examples/direct_token.py
Or, if you prefer running from inside the examples/ directory:
cd examples
cp ../.env.example .env
uv run python -m dotenv run -- python direct_token.py
Library Integrations
Use await client.adapt_for(...) with the adapter for your framework. It returns either a new CivicMCPClient (for backend adapters like FastMCP) or adapter-native tool output (e.g. list of schemas or tool definitions).
PydanticAI
from civic_mcp_client import CivicMCPClient
from civic_mcp_client.adapters.pydanticai import pydanticai
client = CivicMCPClient(auth={"token": "your-civic-access-token"})
tools = await client.adapt_for(pydanticai())
LangChain
from civic_mcp_client import CivicMCPClient
from civic_mcp_client.adapters.langchain import execute_langchain_tool_call, langchain
client = CivicMCPClient(auth={"token": "your-civic-access-token"})
tool_schemas = await client.adapt_for(langchain())
# model = model.bind_tools(tool_schemas)
# response = model.invoke("...")
# tool_result = await execute_langchain_tool_call(client, response.tool_calls[0])
FastMCP
from civic_mcp_client import CivicMCPClient
from civic_mcp_client.adapters.fastmcp import fastmcp
client = CivicMCPClient(
auth={"token": "your-civic-access-token"},
civic_profile="optional-profile-id",
)
fastmcp_client = await client.adapt_for(fastmcp())
# fastmcp_client is a CivicMCPClient with FastMCP backend; auth/headers come from config
tools = await fastmcp_client.get_tools()
Interface Notes
civic_accountwas removed from Python client config to match the updated TypeScript direction.civic_profileremains supported and maps tox-civic-profile-id.TokenExchangeConfigsupportsexpires_inandlock_to_profile(account lock removed).
Metadata
Release files for civic-mcp-client 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| civic_mcp_client-0.1.0.tar.gz | 14.9 kB | With provenance | Details for civic_mcp_client-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| civic_mcp_client-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for civic_mcp_client-0.1.0-py3-none-any.whl |
Total release size: 28.0 kB
Release files / civic_mcp_client-0.1.0.tar.gz
| Download URL | civic_mcp_client-0.1.0.tar.gz |
|---|---|
| Size | 14.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7e9193b28a18a0691fe9abc3d04d786fd8cf5bd1aa4260e3b76e81ab73f106d8
|
|
BLAKE2b-256 checksum How to use checksums |
b97296b535970c16efc3efc1c2bd6be7665b76fc495609aa3def3d83595d69b2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 19, 2026.
Transparency logRelease files / civic_mcp_client-0.1.0-py3-none-any.whl
| Download URL | civic_mcp_client-0.1.0-py3-none-any.whl |
|---|---|
| Size | 13.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1f088322fe72e19659457105293c9a190f92abdf45167bf86861e33469e785d3
|
|
BLAKE2b-256 checksum How to use checksums |
f9f79dffa03f5ef56bbad92cefa08acbb18f4c67a6bb462b6d10cbd7c9e2bb49
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 19, 2026.
Transparency logSecurity for civic-mcp-client 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for civic_mcp_client-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 19, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.