Skip to main content

python-jsonrpc-lib

Simple, yet solid. JSON-RPC 1.0/2.0 for Python.

JSON-RPC is a small protocol: a method name, some parameters, a result. python-jsonrpc-lib keeps it that way. You write ordinary Python functions and dataclasses; the library handles validation, routing, error responses, and API documentation. No framework lock-in, no external dependencies, no boilerplate.

Install

pip install python-jsonrpc-lib

Quickstart

Define methods as classes with typed parameters. The library validates inputs, routes calls, and builds responses automatically.

from dataclasses import dataclass
from jsonrpc import JSONRPC, Method, MethodGroup

@dataclass
class AddParams:
    a: int
    b: int

class Add(Method):
    def execute(self, params: AddParams) -> int:
        return params.a + params.b

@dataclass
class GreetParams:
    name: str
    greeting: str = 'Hello'

class Greet(Method):
    def execute(self, params: GreetParams) -> str:
        return f'{params.greeting}, {params.name}!'

rpc = JSONRPC(version='2.0')
rpc.register('add', Add())
rpc.register('greet', Greet())

response = rpc.handle('{"jsonrpc": "2.0", "method": "add", "params": {"a": 5, "b": 3}, "id": 1}')
# '{"jsonrpc": "2.0", "result": 8, "id": 1}'

Pass in a JSON string, get a JSON string back. What carries it over the wire is up to you.

If a is "five" instead of 5, the caller receives a -32602 Invalid params error immediately — no exception handling on your end.

That covers the types JSON itself has. For a value JSON cannot express — a date, an Enum, a Decimal — take it as a str and convert it in __post_init__, raising ValueError on anything you will not accept; that also becomes -32602. See Parameters.

The same AddParams dataclass drives validation, IDE autocomplete, and the OpenAPI schema.

Why python-jsonrpc-lib?

  • Zero dependencies — pure Python 3.11+. Nothing to pin, nothing to audit beyond the library itself.
  • Type validation from dataclasses — declare parameters as a dataclass, get automatic validation and clear error messages for free.
  • OpenAPI docs auto-generated — type hints and docstrings you already wrote become a full OpenAPI 3.0 spec. Point any Swagger-compatible UI at it and your API is self-documented.
  • Transport-agnosticrpc.handle(json_string) returns a string, or None for a notification. HTTP, WebSocket, TCP, message queue: your choice.
  • Spec-compliant by default — v1.0 and v2.0 rules enforced out of the box, configurable when you need to support legacy clients.

Namespacing and Middleware

Use MethodGroup to organize methods into namespaces and add cross-cutting concerns:

from jsonrpc.errors import JSONRPCError

math = MethodGroup()
math.register('add', Add())

rpc = JSONRPC(version='2.0')
rpc.register('math', math)

# "math.add" is now available

# Cross-cutting concerns go in around_call(), which runs for every group
# on the path -- so a guard mounted here covers everything nested below it.
# Refuse with a JSONRPCError subclass: anything else becomes a bare
# -32603 Internal error, and the caller cannot tell a refusal from a fault.
class Unauthenticated(JSONRPCError):
    code = -32010
    message = 'Authentication required'

class RequireAuth(MethodGroup):
    def around_call(self, call, context, call_next):
        if context.user_id is None:
            raise Unauthenticated()
        return call_next(context)

Quick Prototyping

For scripts and throwaway code, the @rpc.method decorator registers functions directly (v2.0 only):

rpc = JSONRPC(version='2.0')

@rpc.method
def add(a: int, b: int) -> int:
    return a + b

For production use, prefer Method classes — they support context, middleware, and groups.

Documentation

Full documentation with tutorials, integration guides, and API reference:

Claude Code Integration

If you use Claude Code, a skill for this library is available. It gives Claude built-in knowledge of jsonrpc-lib's API: creating methods, registering them, organizing with groups, handling errors, and adding context and middleware — without having to look up docs.

To use it, add the skill file to your project's .claude/skills/ directory.

License

MIT

Download files

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

Source Distribution

python_jsonrpc_lib-0.4.0.tar.gz (187.3 kB view details)

Uploaded Source

Built Distribution

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

python_jsonrpc_lib-0.4.0-py3-none-any.whl (53.6 kB view details)

Uploaded Python 3

File details

Details for the file python_jsonrpc_lib-0.4.0.tar.gz.

File metadata

  • Download URL: python_jsonrpc_lib-0.4.0.tar.gz
  • Upload date:
  • Size: 187.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Linux Mint","version":"22.2","id":"zara","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for python_jsonrpc_lib-0.4.0.tar.gz
Algorithm Hash digest
SHA256 1da55588a803c6859f76ae5822fe311925b8b02c975da563fa46fba4f40f55a7
MD5 8f9a2aefc9a26ad73e33cc40345906fe
BLAKE2b-256 7865d954e8fc15e06e414b4c037f458a5120fad5676b338407c67b33e52a0d43

See more details on using hashes here.

File details

Details for the file python_jsonrpc_lib-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: python_jsonrpc_lib-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 53.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Linux Mint","version":"22.2","id":"zara","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for python_jsonrpc_lib-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7190947f09fb050c9f04fa3e19bd45124977170530923f795fbc602019c8b041
MD5 78579fb254b93447d16dc8d674785512
BLAKE2b-256 9749ede23ae79bbbcd24df3fda26caa3278a6f7ed2605983a3d3662b78175df7

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.4.0 This release

2 files

0.3.2

2 files

0.3.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page