lime-mcp-server-sdk
Verify LIME MCP passport JWTs on your resource server — local JWKS, no LIME hop on the hot path.
from lime_mcp_server import TokenVerifier
verifier = TokenVerifier(expected_domain="tools.example.com")
result = verifier.verify(bearer_token) # Authorization: Bearer <jwt>
if result.is_valid:
agent_id = result.agent_id # claims["sub"] — then YOUR ACL
What the SDK handles: JWKS fetch · cache · RS256 · aud=mcp · issuer · domain pin · async verify.
Docs: Read the Docs · lime.pics/docs · Platform
Installation
pip install lime-mcp-server-sdk
# pin the hostname this RS serves:
export LIME_EXPECTED_DOMAIN=tools.example.com
Requirements: Python 3.10+ · PyJWT · cryptography · httpx
Config: expected_domain= or LIME_EXPECTED_DOMAIN. Zero JWKS boilerplate — not zero config.
Quick start (canonical) — verify Bearer
from lime_mcp_server import TokenVerifier
verifier = TokenVerifier(expected_domain="tools.example.com")
def authorize_mcp_request(authorization_header: str | None) -> str | None:
if not authorization_header:
return None
token = authorization_header.removeprefix("Bearer ").strip()
if not token:
return None
result = verifier.verify(token)
if not result.is_valid:
return None
return result.agent_id # then apply YOUR tool ACL
Copy-paste: examples/verify-middleware/.
Agent side issues the JWT with lime-agents-sdk (list_tools / call_tool). This package only verifies.
Mental model
TokenVerifier
├── verify(token) / verify_async(token) ← primary
├── warmup() ← production startup
└── cache / refresh / invalidate ← advanced
| Artifact | Audience | Verified here? |
|---|---|---|
MCP JWT (aud=mcp) |
Your MCP RS | Yes |
Site passport (aud=lime-site-login) |
Site backend | No — use lime-sites-sdk |
Never send X-Agent-Token to the MCP server. Agents send only Authorization: Bearer <passport>.
Production — async + JWKS warmup
from contextlib import asynccontextmanager
from lime_mcp_server import TokenVerifier
verifier = TokenVerifier(expected_domain="tools.example.com")
@asynccontextmanager
async def lifespan(app):
verifier.warmup(raise_on_failure=True) # raises on JWKS failure
yield
async def verify_bearer(authorization: str) -> str | None:
token = authorization.removeprefix("Bearer ").strip()
if not token:
return None
result = await verifier.verify_async(token)
if not result.is_valid:
return None
return result.agent_id
Example: examples/async-warmup/.
How the flow fits together
| Step | Who | What |
|---|---|---|
| 1 | Agent (lime-agents-sdk) |
Issues MCP JWT from X-Agent-Token |
| 2 | Agent | Calls your RS with Authorization: Bearer <jwt> |
| 3 | Your server (this SDK) | TokenVerifier.verify — RS256 + aud + domain |
| 4 | Your server | agent_id = sub → your ACL |
MCP JWTs are rejected on LIME HTTP APIs. This SDK is for your MCP server only.
API surface (summary)
| Method | Description |
|---|---|
verify(token) |
Sync RS256 verify → TokenValidationResult |
verify_async(token) |
Non-blocking verify |
warmup() |
Prefetch OAuth metadata + JWKS |
.cache / refresh_cache() / invalidate_cache() |
JWKS cache control |
Result: is_valid, agent_id (sub), domain, error, valid_claims.
Env: LIME_EXPECTED_DOMAIN (or kwarg), LIME_BASE_URL (default https://lime.pics), cache/leeway knobs — see RTD.
Full reference: Read the Docs — API.
Related packages
| Package | Role |
|---|---|
lime-agents-sdk |
Agent worker: issue MCP JWT + call tools |
lime-sites-sdk |
Site backend: site login / binding passports |
Examples
| Path | Purpose |
|---|---|
examples/verify-middleware/ |
Sync Bearer check |
examples/async-warmup/ |
Warmup + verify_async |
Contributing
git clone https://github.com/Mawyxx/lime-mcp-server-sdk.git
cd lime-mcp-server-sdk
pip install -e ".[dev]"
ruff check src tests
mypy src/lime_mcp_server
pytest --cov=lime_mcp_server --cov-fail-under=100
License
MIT — see LICENSE.
Release files for lime-mcp-server-sdk 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| lime_mcp_server_sdk-1.0.1.tar.gz | 22.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| lime_mcp_server_sdk-1.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 36.5 kB
Release files / lime_mcp_server_sdk-1.0.1.tar.gz
| Download URL | lime_mcp_server_sdk-1.0.1.tar.gz |
|---|---|
| Size | 22.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5770c1f2c5ccf7779094b251d35df67113717d46082a2b3ef41fbda6dde54402
|
|
BLAKE2b-256 checksum How to use checksums |
87de8478b894f376e7e425730d6307b0bc16644406bf516ae103f936a85c175e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 24, 2026.
Transparency logRelease files / lime_mcp_server_sdk-1.0.1-py3-none-any.whl
| Download URL | lime_mcp_server_sdk-1.0.1-py3-none-any.whl |
|---|---|
| Size | 13.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1a51f4bc64de79f7931b365ae939e1b28a5845567917b4925a9c3e40f0916ed8
|
|
BLAKE2b-256 checksum How to use checksums |
a3b7c2a2513cff4c33cb54da6cc0d8ad1f7ad029a8ee93b8ea46b6f9708e3244
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 24, 2026.
Transparency log