jupyter-server-api


Namejupyter-server-api JSON
Version 0.1.1 PyPI version JSON
download
home_pageNone
SummaryA client library for interacting with Jupyter servers - focused on server management and kernel listing
upload_time2025-10-10 06:17:32
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseBSD 3-Clause License Copyright (c) 2025, Datalayer All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
keywords client datalayer jupyter kernels server
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <!--
  ~ Copyright (c) 2025 Datalayer, Inc.
  ~
  ~ BSD 3-Clause License
-->

[![Datalayer](https://assets.datalayer.tech/datalayer-25.svg)](https://datalayer.io)

[![Become a Sponsor](https://img.shields.io/static/v1?label=Become%20a%20Sponsor&message=%E2%9D%A4&logo=GitHub&style=flat&color=1ABC9C)](https://github.com/sponsors/datalayer)

# 🪐 Jupyter Server Client

[![Github Actions Status](https://github.com/datalayer/jupyter-server-api/workflows/Build/badge.svg)](https://github.com/datalayer/jupyter-server-api/actions/workflows/build.yml)
[![PyPI - Version](https://img.shields.io/pypi/v/jupyter-server-api)](https://pypi.org/project/jupyter-server-api)

`Jupyter Server Client` is a Python library to interact with Jupyter Server REST API for server management operations. It provides server-level functionality including kernel listing (read-only) while avoiding duplication with existing kernel management libraries.

## Complementary Libraries

This library works alongside existing Datalayer clients:
- **[jupyter-nbmodel-client](https://github.com/datalayer/jupyter-nbmodel-client)**: Real-time notebook collaboration and editing
- **[jupyter-kernel-client](https://github.com/datalayer/jupyter-kernel-client)**: Kernel management and code execution

## Features

- **Contents Management**: File and directory operations (create, read, update, delete)
- **Session Management**: Notebook-kernel session handling
- **Kernel Listing**: List and inspect running kernels (read-only)
- **Server Status**: Server information and health monitoring  
- **Terminal Management**: Server terminal operations
- **KernelSpec Info**: Available kernel specifications discovery
- **Authentication**: Token-based authentication support

## Installation

To install the library, run the following command:

```bash
pip install jupyter_server_api
```

## Quick Start

### Complete Integration Example

See [integration_example.py](integration_example.py) for a comprehensive example showing how all three libraries work together.

### Context Manager

```python
from jupyter_server_api import JupyterServerClient

# Server and content management
with JupyterServerClient("http://localhost:8888", token="your-token") as client:
    # Server information
    server_info = client.get_version()
    print(f"Server version: {server_info.version}")
    
    # Contents management
    notebook = client.contents.create_notebook("my_notebook.ipynb")
    contents = client.contents.list_directory("")
    
    # Session management
    session = client.sessions.create_session("my_notebook.ipynb")
    
    # Available kernelspecs
    kernelspecs = client.kernelspecs.list_kernelspecs()
    
    # List running kernels (read-only)
    kernels = client.kernels.list_kernels()
    for kernel in kernels:
        print(f"Kernel {kernel.id}: {kernel.name} ({kernel.execution_state})")
```

### Integration with Other Datalayer Clients

```python
# Kernel management and execution (jupyter-kernel-client)
from jupyter_kernel_client import KernelClient

with KernelClient(server_url="http://localhost:8888", token="your-token") as kernel:
    result = kernel.execute("print('Hello from kernel!')")
    print(f"Status: {result['status']}")

# Real-time notebook collaboration (jupyter-nbmodel-client)  
from jupyter_nbmodel_client import NbModelClient, get_jupyter_notebook_websocket_url
from jupyter_kernel_client import KernelClient

ws_url = get_jupyter_notebook_websocket_url(
    server_url="http://localhost:8888",
    token="your-token", 
    path="notebook.ipynb"
)

with KernelClient(server_url="http://localhost:8888", token="your-token") as kernel:
    async with NbModelClient(ws_url) as notebook:
        cell_index = notebook.add_code_cell("print('Collaborative!')")
        results = notebook.execute_cell(cell_index, kernel)
```

### Async Support

The client also supports async operations:

```python
import asyncio
from jupyter_server_api import AsyncJupyterServerClient

async def main():
    async with AsyncJupyterServerClient(
        base_url="http://localhost:8888",
        token="your-server-token"
    ) as client:
        # All operations are async
        notebook = await client.contents.create_notebook("async-notebook.ipynb")
        kernel = await client.kernels.start_kernel(name="python3")
        
        # List resources
        kernels = await client.kernels.list_kernels()
        sessions = await client.sessions.list_sessions()

asyncio.run(main())
```

## API Reference

### Contents API

```python
# Create a new notebook
notebook = client.contents.create_notebook("path/to/notebook.ipynb")

# Create a directory
directory = client.contents.create_directory("path/to/directory")

# Get contents (file or directory)
contents = client.contents.get("path/to/file.ipynb")

# Save/update a notebook
updated = client.contents.save_notebook(
    path="path/to/notebook.ipynb",
    content=notebook_content
)

# List directory contents
files = client.contents.list_directory("path/to/directory")

# Rename a file/directory
renamed = client.contents.rename("old/path.ipynb", "new/path.ipynb")

# Delete a file/directory
client.contents.delete("path/to/file.ipynb")

# Copy a file
copy = client.contents.copy_file(
    from_path="source.ipynb", 
    to_path="destination.ipynb"
)
```

### Kernels API

```python
# List all kernels
kernels = client.kernels.list_kernels()

# Start a new kernel
kernel = client.kernels.start_kernel(
    name="python3",  # kernel spec name
    path="/path/to/working/directory"  # optional working directory
)

# Get kernel information
info = client.kernels.get_kernel(kernel_id)

# Restart a kernel
restarted = client.kernels.restart_kernel(kernel_id)

# Interrupt a kernel
client.kernels.interrupt_kernel(kernel_id)

# Delete/stop a kernel
client.kernels.delete_kernel(kernel_id)
```

### Sessions API

```python
# List all sessions
sessions = client.sessions.list_sessions()

# Create a new session
session = client.sessions.create_session(
    path="notebook.ipynb",
    kernel={'name': 'python3'},
    type="notebook",
    name="My Session"
)

# Get session details
session = client.sessions.get_session(session_id)

# Update a session (rename)
updated = client.sessions.update_session(
    session_id=session_id,
    path="new-path.ipynb",
    name="New Session Name"
)

# Delete a session
client.sessions.delete_session(session_id)
```

### Terminals API

```python
# List all terminals
terminals = client.terminals.list_terminals()

# Create a new terminal
terminal = client.terminals.create_terminal()

# Get terminal information
info = client.terminals.get_terminal(terminal_name)

# Delete a terminal
client.terminals.delete_terminal(terminal_name)
```

### Server Info

```python
# Get server version
version = client.get_version()

# Get server status
status = client.get_status()

# Get current user identity
identity = client.get_identity()

# Get kernel specs
kernelspecs = client.kernelspecs.list_kernelspecs()
```

## Error Handling

The client provides specific exceptions for different types of errors:

```python
from jupyter_server_api import (
    JupyterServerClient, 
    JupyterServerError,
    NotFoundError,
    ForbiddenError,
    BadRequestError
)

try:
    client = JupyterServerClient("http://localhost:8888", token="invalid")
    notebook = client.contents.get("nonexistent.ipynb")
except NotFoundError as e:
    print(f"File not found: {e}")
except ForbiddenError as e:
    print(f"Access denied: {e}")
except JupyterServerError as e:
    print(f"Server error: {e}")
```

## Configuration

You can configure the client behavior:

```python
from jupyter_server_api import JupyterServerClient

client = JupyterServerClient(
    base_url="http://localhost:8888",
    token="your-token",
    timeout=30,  # Request timeout in seconds
    verify_ssl=True,  # SSL verification
    user_agent="MyApp/1.0",  # Custom user agent
    max_retries=3,  # Number of retries on failure
    retry_delay=1.0  # Delay between retries
)
```

## Authentication

The client supports multiple authentication methods:

```python
# Token-based authentication (recommended)
client = JupyterServerClient(
    base_url="http://localhost:8888",
    token="your-server-token"
)

# No authentication (for local development)
client = JupyterServerClient(base_url="http://localhost:8888")

# Custom headers
client = JupyterServerClient(
    base_url="http://localhost:8888",
    headers={
        "Authorization": "Bearer your-token",
        "Custom-Header": "value"
    }
)
```

## Development Setup

### Installation

```bash
# Clone the repository
git clone https://github.com/datalayer/jupyter-server-api.git
cd jupyter-server-api

# Install in development mode
pip install -e ".[test,lint,typing]"
```

### Running Tests

```bash
# Install test dependencies
pip install -e ".[test]"

# Run tests
pytest

# Run tests with coverage
pytest --cov=jupyter_server_api --cov-report=html
```

### Code Quality

```bash
# Install linting tools
pip install -e ".[lint]"

# Run linting
ruff check .
ruff format .

# Type checking
mypy jupyter_server_api
```

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

## License

This project is licensed under the BSD 3-Clause License - see the [LICENSE](LICENSE) file for details.

## Related Projects

- [jupyter-nbmodel-client](https://github.com/datalayer/jupyter-nbmodel-client) - Client for real-time collaborative Jupyter notebooks
- [Jupyter Server](https://github.com/jupyter-server/jupyter_server) - The backend for Jupyter web applications
- [JupyterLab](https://github.com/jupyterlab/jupyterlab) - An extensible environment for interactive computing

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "jupyter-server-api",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "client, datalayer, jupyter, kernels, server",
    "author": null,
    "author_email": "Datalayer <info@datalayer.io>",
    "download_url": null,
    "platform": null,
    "description": "<!--\n  ~ Copyright (c) 2025 Datalayer, Inc.\n  ~\n  ~ BSD 3-Clause License\n-->\n\n[![Datalayer](https://assets.datalayer.tech/datalayer-25.svg)](https://datalayer.io)\n\n[![Become a Sponsor](https://img.shields.io/static/v1?label=Become%20a%20Sponsor&message=%E2%9D%A4&logo=GitHub&style=flat&color=1ABC9C)](https://github.com/sponsors/datalayer)\n\n# \ud83e\ude90 Jupyter Server Client\n\n[![Github Actions Status](https://github.com/datalayer/jupyter-server-api/workflows/Build/badge.svg)](https://github.com/datalayer/jupyter-server-api/actions/workflows/build.yml)\n[![PyPI - Version](https://img.shields.io/pypi/v/jupyter-server-api)](https://pypi.org/project/jupyter-server-api)\n\n`Jupyter Server Client` is a Python library to interact with Jupyter Server REST API for server management operations. It provides server-level functionality including kernel listing (read-only) while avoiding duplication with existing kernel management libraries.\n\n## Complementary Libraries\n\nThis library works alongside existing Datalayer clients:\n- **[jupyter-nbmodel-client](https://github.com/datalayer/jupyter-nbmodel-client)**: Real-time notebook collaboration and editing\n- **[jupyter-kernel-client](https://github.com/datalayer/jupyter-kernel-client)**: Kernel management and code execution\n\n## Features\n\n- **Contents Management**: File and directory operations (create, read, update, delete)\n- **Session Management**: Notebook-kernel session handling\n- **Kernel Listing**: List and inspect running kernels (read-only)\n- **Server Status**: Server information and health monitoring  \n- **Terminal Management**: Server terminal operations\n- **KernelSpec Info**: Available kernel specifications discovery\n- **Authentication**: Token-based authentication support\n\n## Installation\n\nTo install the library, run the following command:\n\n```bash\npip install jupyter_server_api\n```\n\n## Quick Start\n\n### Complete Integration Example\n\nSee [integration_example.py](integration_example.py) for a comprehensive example showing how all three libraries work together.\n\n### Context Manager\n\n```python\nfrom jupyter_server_api import JupyterServerClient\n\n# Server and content management\nwith JupyterServerClient(\"http://localhost:8888\", token=\"your-token\") as client:\n    # Server information\n    server_info = client.get_version()\n    print(f\"Server version: {server_info.version}\")\n    \n    # Contents management\n    notebook = client.contents.create_notebook(\"my_notebook.ipynb\")\n    contents = client.contents.list_directory(\"\")\n    \n    # Session management\n    session = client.sessions.create_session(\"my_notebook.ipynb\")\n    \n    # Available kernelspecs\n    kernelspecs = client.kernelspecs.list_kernelspecs()\n    \n    # List running kernels (read-only)\n    kernels = client.kernels.list_kernels()\n    for kernel in kernels:\n        print(f\"Kernel {kernel.id}: {kernel.name} ({kernel.execution_state})\")\n```\n\n### Integration with Other Datalayer Clients\n\n```python\n# Kernel management and execution (jupyter-kernel-client)\nfrom jupyter_kernel_client import KernelClient\n\nwith KernelClient(server_url=\"http://localhost:8888\", token=\"your-token\") as kernel:\n    result = kernel.execute(\"print('Hello from kernel!')\")\n    print(f\"Status: {result['status']}\")\n\n# Real-time notebook collaboration (jupyter-nbmodel-client)  \nfrom jupyter_nbmodel_client import NbModelClient, get_jupyter_notebook_websocket_url\nfrom jupyter_kernel_client import KernelClient\n\nws_url = get_jupyter_notebook_websocket_url(\n    server_url=\"http://localhost:8888\",\n    token=\"your-token\", \n    path=\"notebook.ipynb\"\n)\n\nwith KernelClient(server_url=\"http://localhost:8888\", token=\"your-token\") as kernel:\n    async with NbModelClient(ws_url) as notebook:\n        cell_index = notebook.add_code_cell(\"print('Collaborative!')\")\n        results = notebook.execute_cell(cell_index, kernel)\n```\n\n### Async Support\n\nThe client also supports async operations:\n\n```python\nimport asyncio\nfrom jupyter_server_api import AsyncJupyterServerClient\n\nasync def main():\n    async with AsyncJupyterServerClient(\n        base_url=\"http://localhost:8888\",\n        token=\"your-server-token\"\n    ) as client:\n        # All operations are async\n        notebook = await client.contents.create_notebook(\"async-notebook.ipynb\")\n        kernel = await client.kernels.start_kernel(name=\"python3\")\n        \n        # List resources\n        kernels = await client.kernels.list_kernels()\n        sessions = await client.sessions.list_sessions()\n\nasyncio.run(main())\n```\n\n## API Reference\n\n### Contents API\n\n```python\n# Create a new notebook\nnotebook = client.contents.create_notebook(\"path/to/notebook.ipynb\")\n\n# Create a directory\ndirectory = client.contents.create_directory(\"path/to/directory\")\n\n# Get contents (file or directory)\ncontents = client.contents.get(\"path/to/file.ipynb\")\n\n# Save/update a notebook\nupdated = client.contents.save_notebook(\n    path=\"path/to/notebook.ipynb\",\n    content=notebook_content\n)\n\n# List directory contents\nfiles = client.contents.list_directory(\"path/to/directory\")\n\n# Rename a file/directory\nrenamed = client.contents.rename(\"old/path.ipynb\", \"new/path.ipynb\")\n\n# Delete a file/directory\nclient.contents.delete(\"path/to/file.ipynb\")\n\n# Copy a file\ncopy = client.contents.copy_file(\n    from_path=\"source.ipynb\", \n    to_path=\"destination.ipynb\"\n)\n```\n\n### Kernels API\n\n```python\n# List all kernels\nkernels = client.kernels.list_kernels()\n\n# Start a new kernel\nkernel = client.kernels.start_kernel(\n    name=\"python3\",  # kernel spec name\n    path=\"/path/to/working/directory\"  # optional working directory\n)\n\n# Get kernel information\ninfo = client.kernels.get_kernel(kernel_id)\n\n# Restart a kernel\nrestarted = client.kernels.restart_kernel(kernel_id)\n\n# Interrupt a kernel\nclient.kernels.interrupt_kernel(kernel_id)\n\n# Delete/stop a kernel\nclient.kernels.delete_kernel(kernel_id)\n```\n\n### Sessions API\n\n```python\n# List all sessions\nsessions = client.sessions.list_sessions()\n\n# Create a new session\nsession = client.sessions.create_session(\n    path=\"notebook.ipynb\",\n    kernel={'name': 'python3'},\n    type=\"notebook\",\n    name=\"My Session\"\n)\n\n# Get session details\nsession = client.sessions.get_session(session_id)\n\n# Update a session (rename)\nupdated = client.sessions.update_session(\n    session_id=session_id,\n    path=\"new-path.ipynb\",\n    name=\"New Session Name\"\n)\n\n# Delete a session\nclient.sessions.delete_session(session_id)\n```\n\n### Terminals API\n\n```python\n# List all terminals\nterminals = client.terminals.list_terminals()\n\n# Create a new terminal\nterminal = client.terminals.create_terminal()\n\n# Get terminal information\ninfo = client.terminals.get_terminal(terminal_name)\n\n# Delete a terminal\nclient.terminals.delete_terminal(terminal_name)\n```\n\n### Server Info\n\n```python\n# Get server version\nversion = client.get_version()\n\n# Get server status\nstatus = client.get_status()\n\n# Get current user identity\nidentity = client.get_identity()\n\n# Get kernel specs\nkernelspecs = client.kernelspecs.list_kernelspecs()\n```\n\n## Error Handling\n\nThe client provides specific exceptions for different types of errors:\n\n```python\nfrom jupyter_server_api import (\n    JupyterServerClient, \n    JupyterServerError,\n    NotFoundError,\n    ForbiddenError,\n    BadRequestError\n)\n\ntry:\n    client = JupyterServerClient(\"http://localhost:8888\", token=\"invalid\")\n    notebook = client.contents.get(\"nonexistent.ipynb\")\nexcept NotFoundError as e:\n    print(f\"File not found: {e}\")\nexcept ForbiddenError as e:\n    print(f\"Access denied: {e}\")\nexcept JupyterServerError as e:\n    print(f\"Server error: {e}\")\n```\n\n## Configuration\n\nYou can configure the client behavior:\n\n```python\nfrom jupyter_server_api import JupyterServerClient\n\nclient = JupyterServerClient(\n    base_url=\"http://localhost:8888\",\n    token=\"your-token\",\n    timeout=30,  # Request timeout in seconds\n    verify_ssl=True,  # SSL verification\n    user_agent=\"MyApp/1.0\",  # Custom user agent\n    max_retries=3,  # Number of retries on failure\n    retry_delay=1.0  # Delay between retries\n)\n```\n\n## Authentication\n\nThe client supports multiple authentication methods:\n\n```python\n# Token-based authentication (recommended)\nclient = JupyterServerClient(\n    base_url=\"http://localhost:8888\",\n    token=\"your-server-token\"\n)\n\n# No authentication (for local development)\nclient = JupyterServerClient(base_url=\"http://localhost:8888\")\n\n# Custom headers\nclient = JupyterServerClient(\n    base_url=\"http://localhost:8888\",\n    headers={\n        \"Authorization\": \"Bearer your-token\",\n        \"Custom-Header\": \"value\"\n    }\n)\n```\n\n## Development Setup\n\n### Installation\n\n```bash\n# Clone the repository\ngit clone https://github.com/datalayer/jupyter-server-api.git\ncd jupyter-server-api\n\n# Install in development mode\npip install -e \".[test,lint,typing]\"\n```\n\n### Running Tests\n\n```bash\n# Install test dependencies\npip install -e \".[test]\"\n\n# Run tests\npytest\n\n# Run tests with coverage\npytest --cov=jupyter_server_api --cov-report=html\n```\n\n### Code Quality\n\n```bash\n# Install linting tools\npip install -e \".[lint]\"\n\n# Run linting\nruff check .\nruff format .\n\n# Type checking\nmypy jupyter_server_api\n```\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.\n\n## License\n\nThis project is licensed under the BSD 3-Clause License - see the [LICENSE](LICENSE) file for details.\n\n## Related Projects\n\n- [jupyter-nbmodel-client](https://github.com/datalayer/jupyter-nbmodel-client) - Client for real-time collaborative Jupyter notebooks\n- [Jupyter Server](https://github.com/jupyter-server/jupyter_server) - The backend for Jupyter web applications\n- [JupyterLab](https://github.com/jupyterlab/jupyterlab) - An extensible environment for interactive computing\n",
    "bugtrack_url": null,
    "license": "BSD 3-Clause License\n        \n        Copyright (c) 2025, Datalayer\n        All rights reserved.\n        \n        Redistribution and use in source and binary forms, with or without\n        modification, are permitted provided that the following conditions are met:\n        \n        1. Redistributions of source code must retain the above copyright notice, this\n           list of conditions and the following disclaimer.\n        \n        2. Redistributions in binary form must reproduce the above copyright notice,\n           this list of conditions and the following disclaimer in the documentation\n           and/or other materials provided with the distribution.\n        \n        3. Neither the name of the copyright holder nor the names of its\n           contributors may be used to endorse or promote products derived from\n           this software without specific prior written permission.\n        \n        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n        AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n        IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n        DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n        FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n        DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n        SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n        CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n        OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.",
    "summary": "A client library for interacting with Jupyter servers - focused on server management and kernel listing",
    "version": "0.1.1",
    "project_urls": {
        "Documentation": "https://github.com/datalayer/jupyter-server-api#readme",
        "Homepage": "https://github.com/datalayer/jupyter-server-api",
        "Issues": "https://github.com/datalayer/jupyter-server-api/issues",
        "Repository": "https://github.com/datalayer/jupyter-server-api.git"
    },
    "split_keywords": [
        "client",
        " datalayer",
        " jupyter",
        " kernels",
        " server"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7e16941017441bdb97b29ff8e070a4ba776fbc86a942675f8bab2e073f28a04e",
                "md5": "8c0ed58ac1fe4dfde6ec280cc81e3149",
                "sha256": "e8dc57390e79e828f8cee24b398df8684634c13ba89fa7fe30c27c56c6f89f56"
            },
            "downloads": -1,
            "filename": "jupyter_server_api-0.1.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "8c0ed58ac1fe4dfde6ec280cc81e3149",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 19539,
            "upload_time": "2025-10-10T06:17:32",
            "upload_time_iso_8601": "2025-10-10T06:17:32.630401Z",
            "url": "https://files.pythonhosted.org/packages/7e/16/941017441bdb97b29ff8e070a4ba776fbc86a942675f8bab2e073f28a04e/jupyter_server_api-0.1.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-10 06:17:32",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "datalayer",
    "github_project": "jupyter-server-api#readme",
    "github_not_found": true,
    "lcname": "jupyter-server-api"
}
        
Elapsed time: 1.68248s