Metadata-Version: 2.4
Name: tabsdata
Version: 2.0.1
Summary: Tabsdata is a publish-subscribe (pub/sub) server for tables.
Author: Tabsdata Inc.
License: Tabsdata License
Project-URL: Homepage, https://tabsdata.com
Project-URL: Documentation, https://docs.tabsdata.com
Project-URL: Source, https://github.com/tabsdata/tabsdata
Keywords: tabsdata,data,tables,pub/sub,publish/subscribe
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Information Technology
Classifier: Programming Language :: JavaScript
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Programming Language :: Rust
Classifier: Operating System :: OS Independent
Requires-Python: >=3.12
Description-Content-Type: text/markdown
License-File: variant/assets/manifest/LICENSE
Requires-Dist: accessify==0.3.1
Requires-Dist: archspec==0.2.5
Requires-Dist: base32hex==1.0.2
Requires-Dist: boto3==1.43.78
Requires-Dist: boto3-stubs[glue]==1.43.78
Requires-Dist: click==8.4.2
Requires-Dist: click-repl==0.3.0
Requires-Dist: clickhouse-connect==0.14.1
Requires-Dist: cloudpickle==3.1.2
Requires-Dist: colorama==0.4.6
Requires-Dist: connectorx==0.4.5
Requires-Dist: croniter==6.2.2
Requires-Dist: cryptography==47.0.0
Requires-Dist: fastavro==1.12.1
Requires-Dist: fastparquet==2026.3.0
Requires-Dist: filelock==3.25.2
Requires-Dist: google-cloud-storage==3.10.0
Requires-Dist: google-cloud-storage-control==1.10.0
Requires-Dist: grpcio-tools==1.80.0
Requires-Dist: humanize==4.15.0
Requires-Dist: hvac==2.4.0
Requires-Dist: ibm_db==3.2.8; sys_platform == "darwin" or (platform_machine != "aarch64" and platform_machine != "ARM64")
Requires-Dist: ibm_db_sa==0.4.4; sys_platform == "darwin" or (platform_machine != "aarch64" and platform_machine != "ARM64")
Requires-Dist: ijson==3.5.0
Requires-Dist: importlib-metadata==8.7.1
Requires-Dist: isodate==0.7.2
Requires-Dist: jsonschema==4.26.0
Requires-Dist: numpy==2.4.3
Requires-Dist: orjson==3.11.7
Requires-Dist: packaging==26.0
Requires-Dist: pandas==2.3.3
Requires-Dist: pillow==12.1.1
Requires-Dist: pip-tools==7.5.3
Requires-Dist: platformdirs==4.9.4
Requires-Dist: polars==1.39.3
Requires-Dist: prompt-toolkit==3.0.52
Requires-Dist: protobuf==6.33.6
Requires-Dist: pycountries==1.2.1
Requires-Dist: pyyaml==6.0.3
Requires-Dist: pyarrow==23.0.1
Requires-Dist: py-cpuinfo==9.0.0
Requires-Dist: pydantic==2.12.5
Requires-Dist: pyiceberg[glue]==0.11.1
Requires-Dist: pyopenssl==26.1.0
Requires-Dist: pywin32==311; platform_system == "Windows"
Requires-Dist: requests==2.32.5
Requires-Dist: rich==14.3.3
Requires-Dist: rich-click==1.9.7
Requires-Dist: ruamel-yaml==0.19.1
Requires-Dist: sqlalchemy==2.0.48
Requires-Dist: sqlglot==30.0.3
Requires-Dist: starlette==1.0.0
Requires-Dist: tenacity==9.1.4
Requires-Dist: typing-extensions==4.15.0
Requires-Dist: tzlocal==5.3.1
Requires-Dist: uuid6==2025.0.1
Requires-Dist: uuid-v7==1.0.0
Requires-Dist: uv==0.10.12
Requires-Dist: zstandard==0.25.0
Provides-Extra: test
Requires-Dist: accessify==0.3.1; extra == "test"
Requires-Dist: archspec==0.2.5; extra == "test"
Requires-Dist: base32hex==1.0.2; extra == "test"
Requires-Dist: boto3==1.43.78; extra == "test"
Requires-Dist: boto3-stubs[glue]==1.43.78; extra == "test"
Requires-Dist: click==8.4.2; extra == "test"
Requires-Dist: click-repl==0.3.0; extra == "test"
Requires-Dist: clickhouse-connect==0.14.1; extra == "test"
Requires-Dist: cloudpickle==3.1.2; extra == "test"
Requires-Dist: colorama==0.4.6; extra == "test"
Requires-Dist: connectorx==0.4.5; extra == "test"
Requires-Dist: croniter==6.2.2; extra == "test"
Requires-Dist: cryptography==47.0.0; extra == "test"
Requires-Dist: fastavro==1.12.1; extra == "test"
Requires-Dist: fastparquet==2026.3.0; extra == "test"
Requires-Dist: filelock==3.25.2; extra == "test"
Requires-Dist: google-cloud-storage==3.10.0; extra == "test"
Requires-Dist: google-cloud-storage-control==1.10.0; extra == "test"
Requires-Dist: grpcio-tools==1.80.0; extra == "test"
Requires-Dist: humanize==4.15.0; extra == "test"
Requires-Dist: hvac==2.4.0; extra == "test"
Requires-Dist: ibm_db==3.2.8; (sys_platform == "darwin" or (platform_machine != "aarch64" and platform_machine != "ARM64")) and extra == "test"
Requires-Dist: ibm_db_sa==0.4.4; (sys_platform == "darwin" or (platform_machine != "aarch64" and platform_machine != "ARM64")) and extra == "test"
Requires-Dist: ijson==3.5.0; extra == "test"
Requires-Dist: importlib-metadata==8.7.1; extra == "test"
Requires-Dist: isodate==0.7.2; extra == "test"
Requires-Dist: jsonschema==4.26.0; extra == "test"
Requires-Dist: numpy==2.4.3; extra == "test"
Requires-Dist: orjson==3.11.7; extra == "test"
Requires-Dist: packaging==26.0; extra == "test"
Requires-Dist: pandas==2.3.3; extra == "test"
Requires-Dist: pillow==12.1.1; extra == "test"
Requires-Dist: pip-tools==7.5.3; extra == "test"
Requires-Dist: platformdirs==4.9.4; extra == "test"
Requires-Dist: polars==1.39.3; extra == "test"
Requires-Dist: prompt-toolkit==3.0.52; extra == "test"
Requires-Dist: protobuf==6.33.6; extra == "test"
Requires-Dist: pycountries==1.2.1; extra == "test"
Requires-Dist: pyyaml==6.0.3; extra == "test"
Requires-Dist: pyarrow==23.0.1; extra == "test"
Requires-Dist: py-cpuinfo==9.0.0; extra == "test"
Requires-Dist: pydantic==2.12.5; extra == "test"
Requires-Dist: pyiceberg[glue]==0.11.1; extra == "test"
Requires-Dist: pyopenssl==26.1.0; extra == "test"
Requires-Dist: pywin32==311; platform_system == "Windows" and extra == "test"
Requires-Dist: requests==2.32.5; extra == "test"
Requires-Dist: rich==14.3.3; extra == "test"
Requires-Dist: rich-click==1.9.7; extra == "test"
Requires-Dist: ruamel-yaml==0.19.1; extra == "test"
Requires-Dist: sqlalchemy==2.0.48; extra == "test"
Requires-Dist: sqlglot==30.0.3; extra == "test"
Requires-Dist: starlette==1.0.0; extra == "test"
Requires-Dist: tenacity==9.1.4; extra == "test"
Requires-Dist: typing-extensions==4.15.0; extra == "test"
Requires-Dist: tzlocal==5.3.1; extra == "test"
Requires-Dist: uuid6==2025.0.1; extra == "test"
Requires-Dist: uuid-v7==1.0.0; extra == "test"
Requires-Dist: uv==0.10.12; extra == "test"
Requires-Dist: zstandard==0.25.0; extra == "test"
Requires-Dist: pydantic==2.12.5; extra == "test"
Requires-Dist: croniter==6.2.2; extra == "test"
Requires-Dist: ruamel.yaml==0.19.1; extra == "test"
Requires-Dist: google-cloud-bigquery==3.40.1; extra == "test"
Requires-Dist: sqlalchemy-bigquery==1.17.0; extra == "test"
Requires-Dist: uuid6==2025.0.1; extra == "test"
Requires-Dist: boto3==1.43.78; extra == "test"
Requires-Dist: boto3-stubs[glue]==1.43.78; extra == "test"
Requires-Dist: azure-storage-blob==12.28.0; extra == "test"
Requires-Dist: google-cloud-storage==3.10.0; extra == "test"
Requires-Dist: google-cloud-storage-control==1.10.0; extra == "test"
Requires-Dist: PyYAML==6.0.3; extra == "test"
Requires-Dist: types-PyYAML==6.0.3; extra == "test"
Requires-Dist: sqlalchemy==2.0.48; extra == "test"
Requires-Dist: polars==1.39.3; extra == "test"
Requires-Dist: pyarrow==23.0.1; extra == "test"
Requires-Dist: pandas==2.3.3; extra == "test"
Requires-Dist: tenacity==9.1.4; extra == "test"
Requires-Dist: databricks-sdk==0.102.0; extra == "test"
Requires-Dist: databricks-sql-connector==4.2.5; extra == "test"
Requires-Dist: requests==2.32.5; extra == "test"
Requires-Dist: avro==1.12.1; extra == "test"
Requires-Dist: boto3==1.43.78; extra == "test"
Requires-Dist: confluent-kafka==2.14.0; extra == "test"
Requires-Dist: grpcio-tools==1.80.0; extra == "test"
Requires-Dist: jsonschema==4.26.0; extra == "test"
Requires-Dist: orjson==3.11.7; extra == "test"
Requires-Dist: protobuf==6.33.6; extra == "test"
Requires-Dist: pymongo==4.16.0; extra == "test"
Requires-Dist: pyodbc==5.3.0; extra == "test"
Requires-Dist: pymysql==1.2.0; extra == "test"
Requires-Dist: mysql-replication==1.0.15; extra == "test"
Requires-Dist: orjson==3.11.7; extra == "test"
Requires-Dist: simple-salesforce==1.12.9; extra == "test"
Requires-Dist: opentelemetry-api==1.40.0; extra == "test"
Requires-Dist: opentelemetry-sdk==1.40.0; extra == "test"
Requires-Dist: snowflake-connector-python==4.4.0; extra == "test"
Requires-Dist: sqlalchemy==2.0.48; extra == "test"
Requires-Dist: mysql-connector-python==9.6.0; extra == "test"
Requires-Dist: oracledb==3.4.2; extra == "test"
Requires-Dist: psycopg2-binary==2.9.11; extra == "test"
Requires-Dist: ansi2html==1.9.2; extra == "test"
Requires-Dist: archspec==0.2.5; extra == "test"
Requires-Dist: azure-storage-blob==12.28.0; extra == "test"
Requires-Dist: black==26.5.1; extra == "test"
Requires-Dist: boto3==1.43.78; extra == "test"
Requires-Dist: build==1.4.0; extra == "test"
Requires-Dist: colorama==0.4.6; extra == "test"
Requires-Dist: colorlog==6.10.1; extra == "test"
Requires-Dist: csvkit==2.2.0; extra == "test"
Requires-Dist: devpi-client==7.2.1; extra == "test"
Requires-Dist: devpi-server==6.19.0; extra == "test"
Requires-Dist: devpi-web==5.0.2; extra == "test"
Requires-Dist: distlib==0.4.0; extra == "test"
Requires-Dist: docker==7.1.0; extra == "test"
Requires-Dist: fastapi==0.135.2; extra == "test"
Requires-Dist: gita==0.16.8.2; extra == "test"
Requires-Dist: gitpython==3.1.46; extra == "test"
Requires-Dist: google-cloud-storage==3.10.0; extra == "test"
Requires-Dist: gtts==2.2.4; extra == "test"
Requires-Dist: import-linter==2.11; extra == "test"
Requires-Dist: kafka-python==2.3.0; extra == "test"
Requires-Dist: kubernetes==35.0.0; extra == "test"
Requires-Dist: liccheck==0.9.2; extra == "test"
Requires-Dist: licensecheck==2025.1.0; extra == "test"
Requires-Dist: matplotlib==3.10.8; extra == "test"
Requires-Dist: maturin==1.12.6; extra == "test"
Requires-Dist: mimesis==19.1.0; extra == "test"
Requires-Dist: mkdocs==1.6.1; extra == "test"
Requires-Dist: mypy==2.1.0; extra == "test"
Requires-Dist: mypy-extensions==1.1.0; extra == "test"
Requires-Dist: parquet-tools==0.2.16; extra == "test"
Requires-Dist: pdoc==16.0.0; extra == "test"
Requires-Dist: pip-audit==2.10.0; extra == "test"
Requires-Dist: pip-tools==7.5.3; extra == "test"
Requires-Dist: pip-upgrader==2.4.0; extra == "test"
Requires-Dist: pipdeptree==2.33.0; extra == "test"
Requires-Dist: prompt-toolkit==3.0.52; extra == "test"
Requires-Dist: psutil==7.2.2; extra == "test"
Requires-Dist: py-cpuinfo==9.0.0; extra == "test"
Requires-Dist: py-spy==0.4.1; extra == "test"
Requires-Dist: pydevd_pycharm==261.22158.220; extra == "test"
Requires-Dist: pygame==2.6.1; extra == "test"
Requires-Dist: pysentry-rs==0.4.5; extra == "test"
Requires-Dist: pytest-check==2.7.7; extra == "test"
Requires-Dist: pytest-cov==7.0.0; extra == "test"
Requires-Dist: pytest-env==1.6.0; extra == "test"
Requires-Dist: pytest-instafail==0.5.0; extra == "test"
Requires-Dist: pytest-reporter-html1==0.9.5; extra == "test"
Requires-Dist: pytest-timeout==2.4.0; extra == "test"
Requires-Dist: pytest-xdist==3.8.0; extra == "test"
Requires-Dist: pytest==9.0.2; extra == "test"
Requires-Dist: python_on_whales==0.81.0; extra == "test"
Requires-Dist: python-dateutil==2.9.0.post0; extra == "test"
Requires-Dist: python_on_whales==0.81.0; extra == "test"
Requires-Dist: PyYAML==6.0.3; extra == "test"
Requires-Dist: questionary==2.1.1; extra == "test"
Requires-Dist: ruff==0.15.7; extra == "test"
Requires-Dist: setuptools==83.0.0; extra == "test"
Requires-Dist: six==1.17.0; extra == "test"
Requires-Dist: supervisor==4.3.0; extra == "test"
Requires-Dist: tabulate==0.9.0; extra == "test"
Requires-Dist: textual-plotext==1.0.1; extra == "test"
Requires-Dist: textual==8.2.3; extra == "test"
Requires-Dist: tomlkit==0.14.0; extra == "test"
Requires-Dist: tqdm==4.67.3; extra == "test"
Requires-Dist: twine==6.2.0; extra == "test"
Requires-Dist: types-PyYAML==6.0.3; extra == "test"
Requires-Dist: tzlocal==5.3.1; extra == "test"
Requires-Dist: uvicorn==0.42.0; extra == "test"
Requires-Dist: virtualenv==21.2.0; extra == "test"
Requires-Dist: wcwidth==0.2.14; extra == "test"
Requires-Dist: wheel-inspect==1.8.0; extra == "test"
Requires-Dist: wheel==0.47.0; extra == "test"
Provides-Extra: api
Requires-Dist: tabsdata-api[deps]==2.0.1; extra == "api"
Provides-Extra: backend
Requires-Dist: tabsdata-backend[deps]==2.0.1; extra == "backend"
Provides-Extra: cli
Requires-Dist: tabsdata-cli[deps]==2.0.1; extra == "cli"
Provides-Extra: common
Requires-Dist: tabsdata-common[deps]==2.0.1; extra == "common"
Provides-Extra: conn-azureblob
Requires-Dist: tabsdata-conn-azureblob[deps]==2.0.1; extra == "conn-azureblob"
Provides-Extra: conn-bigquery
Requires-Dist: tabsdata-conn-bigquery[deps]==2.0.1; extra == "conn-bigquery"
Provides-Extra: conn-clickhouse
Requires-Dist: tabsdata-conn-clickhouse[deps]==2.0.1; extra == "conn-clickhouse"
Provides-Extra: conn-common
Requires-Dist: tabsdata-conn-common[deps]==2.0.1; extra == "conn-common"
Provides-Extra: conn-common-file
Requires-Dist: tabsdata-conn-common-file[deps]==2.0.1; extra == "conn-common-file"
Provides-Extra: conn-common-sql
Requires-Dist: tabsdata-conn-common-sql[deps]==2.0.1; extra == "conn-common-sql"
Provides-Extra: conn-databricks
Requires-Dist: tabsdata-conn-databricks[deps]==2.0.1; extra == "conn-databricks"
Provides-Extra: conn-db2
Requires-Dist: tabsdata-conn-db2[deps]==2.0.1; extra == "conn-db2"
Provides-Extra: conn-dev
Requires-Dist: tabsdata-conn-dev[deps]==2.0.1; extra == "conn-dev"
Provides-Extra: conn-druid
Requires-Dist: tabsdata-conn-druid[deps]==2.0.1; extra == "conn-druid"
Provides-Extra: conn-gcs
Requires-Dist: tabsdata-conn-gcs[deps]==2.0.1; extra == "conn-gcs"
Provides-Extra: conn-kafka
Requires-Dist: tabsdata-conn-kafka[deps]==2.0.1; extra == "conn-kafka"
Provides-Extra: conn-localfile
Requires-Dist: tabsdata-conn-localfile[deps]==2.0.1; extra == "conn-localfile"
Provides-Extra: conn-mongodb
Requires-Dist: tabsdata-conn-mongodb[deps]==2.0.1; extra == "conn-mongodb"
Provides-Extra: conn-mssql
Requires-Dist: tabsdata-conn-mssql[deps]==2.0.1; extra == "conn-mssql"
Provides-Extra: conn-mysql
Requires-Dist: tabsdata-conn-mysql[deps]==2.0.1; extra == "conn-mysql"
Provides-Extra: conn-oracle
Requires-Dist: tabsdata-conn-oracle[deps]==2.0.1; extra == "conn-oracle"
Provides-Extra: conn-postgres
Requires-Dist: tabsdata-conn-postgres[deps]==2.0.1; extra == "conn-postgres"
Provides-Extra: conn-s3
Requires-Dist: tabsdata-conn-s3[deps]==2.0.1; extra == "conn-s3"
Provides-Extra: conn-salesforce
Requires-Dist: tabsdata-conn-salesforce[deps]==2.0.1; extra == "conn-salesforce"
Provides-Extra: conn-snowflake
Requires-Dist: tabsdata-conn-snowflake[deps]==2.0.1; extra == "conn-snowflake"
Provides-Extra: conn-starrocks
Requires-Dist: tabsdata-conn-starrocks[deps]==2.0.1; extra == "conn-starrocks"
Provides-Extra: conn-stream-stage
Requires-Dist: tabsdata-conn-stream-stage[deps]==2.0.1; extra == "conn-stream-stage"
Provides-Extra: control-plane
Requires-Dist: tabsdata-control-plane[deps]==2.0.1; extra == "control-plane"
Provides-Extra: execution-plane
Requires-Dist: tabsdata-execution-plane[deps]==2.0.1; extra == "execution-plane"
Provides-Extra: medallion
Requires-Dist: tabsdata-medallion[deps]==2.0.1; extra == "medallion"
Provides-Extra: sdk
Requires-Dist: tabsdata-sdk[deps]==2.0.1; extra == "sdk"
Provides-Extra: server
Requires-Dist: tabsdata-server[deps]==2.0.1; extra == "server"
Provides-Extra: all
Requires-Dist: tabsdata-api[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-backend[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-cli[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-common[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-azureblob[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-bigquery[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-clickhouse[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-common-file[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-common-sql[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-common[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-databricks[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-db2[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-dev[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-druid[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-gcs[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-kafka[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-localfile[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-mongodb[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-mssql[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-mysql[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-oracle[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-postgres[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-s3[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-salesforce[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-snowflake[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-starrocks[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-conn-stream-stage[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-control-plane[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-execution-plane[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-medallion[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-sdk[deps]==2.0.1; extra == "all"
Requires-Dist: tabsdata-server[deps]==2.0.1; extra == "all"
Dynamic: description
Dynamic: description-content-type
Dynamic: license
Dynamic: license-file
Dynamic: provides-extra
Dynamic: requires-dist
Dynamic: requires-python

<!--
Copyright 2026 Tabsdata Inc.
-->

<div align="center">
    <svg
        width="825"
        height="210"
        viewBox="0 0 504 128"
        fill="none"
        xmlns="http://www.w3.org/2000/svg"
    >
        <g id="wordmark">
            <path
                fill="currentColor"
                d="M436 34V48H448V56H436V77C436 78.66 437.34 80 439 80H446V88H440C431 88 428 85 428 76V56H420V48H428V34H436Z"
            />
            <path
                fill="currentColor"
                d="M208 48H184V56H209C210.66 56 212 57.34 212 59V64H191C184.37 64 180 67 180 75.5C180 84 184.37 88 191 88H213C216.87 88 220 84.87 220 81V60C220 53.37 217 48 208 48ZM212 77C212 78.66 210.66 80 209 80H192C189.79 80 188 79 188 75.5C188 72 189.79 72 192 72H212V77Z"
            />
            <path
                fill="currentColor"
                d="M401 48H377V56H402C403.66 56 405 57.34 405 59V64H384C377.37 64 373 67 373 75.5C373 84 377.37 88 384 88H406C409.87 88 413 84.87 413 81V60C413 53.37 410 48 401 48ZM405 77C405 78.66 403.66 80 402 80H385C382.79 80 381 79 381 75.5C381 72 382.79 72 385 72H405V77Z"
            />
            <path
                fill="currentColor"
                d="M482 48H458V56H483C484.66 56 486 57.34 486 59V64H465C458.37 64 454 67 454 75.5C454 84 458.37 88 465 88H487C490.87 88 494 84.87 494 81V60C494 53.37 491 48 482 48ZM486 77C486 78.66 484.66 80 483 80H466C463.79 80 462 79 462 75.5C462 72 463.79 72 466 72H486V77Z"
            />
            <path
                fill="currentColor"
                d="M251 48H238V34H230V75C230 83.84 235 88 244 88H251C264 88 270 82 270 68C270 54 264 48 251 48ZM253 80H243C240.24 80 238 78.31 238 75V56H253C259 56 262 60 262 68C262 76 259 80 253 80Z"
            />
            <path
                fill="currentColor"
                d="M325 68C325 82 331 88 344 88H351C360 88 365 83.84 365 75V34H357V48H344C331 48 325 54 325 68ZM333 68C333 60 336 56 342 56H357V75C357 78.31 354.76 80 352 80H342C336 80 333 76 333 68Z"
            />
            <path
                fill="currentColor"
                d="M289 72H306C308.21 72 310 72 310 75.5C310 79 308.21 80 306 80H279V88H307C313.63 88 318 84 318 75.5C318 67 313.63 64 307 64H290C287.79 64 286 63 286 59.5C286 56 287.79 56 290 56H316V48H289C282.37 48 278 51 278 59.5C278 68 282.37 72 289 72Z"
            />
            <path
                fill="currentColor"
                d="M162 34V48H174V56H162V77C162 78.6599 163.34 79.9999 165 80H172V88H166C157 87.9999 154 84.9999 154 76V56H146V48H154V34H162Z"
            />
        </g>
        <g id="arrow">
            <path
                fill="#59B359"
                d="M90.8188 61.1719C91.569 61.922 91.9907 62.9391 91.9907 64C91.9907 65.0609 91.569 66.078 90.8188 66.8281L42.8188 114.828L37.1626 109.172L78.3345 68H7.99072V60H78.3345L37.1626 18.8281L42.8188 13.1719L90.8188 61.1719Z"
            />
            <path
                fill="#34BBFF"
                d="M106.819 85.1719L101.163 90.8281L86.8193 76.4844L92.4756 70.8281L106.819 85.1719Z"
            />
            <path
                fill="#34BBFF"
                d="M119.991 60V68H94.917C95.6133 66.7939 95.9902 65.4167 95.9902 64C95.9902 62.5833 95.6133 61.2061 94.917 60H119.991Z"
            />
            <path
                fill="#34BBFF"
                d="M106.819 42.8281L92.4756 57.1709L86.8193 51.5146L101.163 37.1719L106.819 42.8281Z"
            />
        </g>
    </svg>
</div>

<div align="center">
    <a href="https://tabsdata.com">Tabsdata</a> |
    <a href="https://docs.tabsdata.com/2.0.1/guide">User Guide</a> |
    <a href="https://docs.tabsdata.com/2.0.1/api">API Reference</a>
</div>

# License

Your use of this product is subject to the terms of use available at https://tabsdata.com/license.

# Tabsdata: An Agent-Ready Data Engineering Platform

[Tabsdata](https://tabsdata.com) is a declarative publish-subscribe (pub/sub) server for tables.
Functions declare the tables they read and the tables they write, and the server handles the rest:
loading, processing, storing and moving. Everything the server knows, tables, versions,
dependencies, definitions and execution history, is addressable through its API, which is what
lets an AI agent drive it end to end.

The server derives the dependency graph from those declarations and triggers downstream functions
when a new version of an upstream table is committed. There is no pipeline to wire end to end and
no external scheduler, so answering a new request is a declaration against tables that already
exist rather than a dataflow assembled from scratch.

Tables are immutable and versioned. A function run does not mutate a table, it commits a new
version, and each run is recorded against the table versions it read and wrote. Lineage and
provenance are a product of execution rather than a separate metadata pass, so any table, dataflow
or run can be inspected or replayed as of any point in time.

Tabsdata has connectors to publish and subscribe tables from local files, S3, Azure Storage,
MySQL/MariaDB, Oracle, PostgreSQL. It also provides a Connector Plugin API to write custom
connectors.

Tables can be populated with external data or using data from other tables already existing
in the Tabsdata server.

Tables can be manipulated using a [TableFrame API](https://docs.tabsdata.com/2.0.1/api/category/tableframe/)
(internally Tabsdata uses [Polars](https://github.com/pola-rs/polars)) that enables selection,
filtering, aggregation and joins operations.

The server additionally provides a semantic catalog, which classifies the metadata of connected
sources and destinations on connection and keeps it current as they change, recording what a table
holds and how it is used alongside its schema; and medallion primitives, which provide raw
capture, quality observation, change data capture and slowly changing dimensions as composable
functions.

Function code is the same whether the server runs as a single instance on a laptop or workstation
or on a Kubernetes cluster, where function execution scales out on the cluster and table storage
is backed by cloud object storage.

## Driving Tabsdata from an AI Agent

The dependency graph, table versions, execution history and semantic catalog are first-class
objects of the server API, not metadata reconstructed after the fact. An agent queries what a
table holds, what produced it, what depends on it and what changed between two versions, and it
operates on what the server recorded rather than on inference about it. Writes follow the same
rules as any other client: a function run commits a new version instead of mutating a table, under
the same access control, and earlier versions remain readable.

* **MCP server** - exposes the catalog, table versions, dependency graph and execution history, as
  well as the operations to define, trigger and inspect functions, to external AI agents.
* **Built-in agent** - in the Tabsdata UI, scoped to operations: what ran, what failed and why.

For more details refer
to [Tabsdata Getting Started](https://docs.tabsdata.com/guide/introduction)
(latest) or the [Tabsdata User Guide](https://docs.tabsdata.com/guide) (latest).

## Installation

Supported platforms:

* Windows (x86 - latest)
* macOS (Apple silicon - latest)
* Ubuntu, Debian & RedHat - (x86 - latest)
* Kubernetes (AWS EKS - latest, more distributions in upcoming releases)

```
pip install "tabsdata[all]"
```

### Running Tabsdata Locally

`tdkserver quickstart` initializes, creates and starts a local instance. AI integration is
configured with whichever key is given on the command line:

```
$ tdkserver quickstart                                    # without AI integration
$ tdkserver quickstart --anthropic-key $ANTHROPIC_API_KEY # integration with Anthropic
$ tdkserver quickstart --openai-key $OPENAI_API_KEY       # integration with OpenAI
```

## This version (2.0.1) Documentation

* [User Guide](https://docs.tabsdata.com/2.0.1/guide)
* [API Reference](https://docs.tabsdata.com/2.0.1/api)

## How Does Tabsdata Work?

The following snippets show how to publish and subscribe to tables in Tabsdata.

Endpoints and credentials are declared as connections, apart from function code, and attached to
the collection a function is registered in. Functions declare only what they read and write.

### Declaring a Connection to a MySQL Database

```
kind: connectionDef
apiVersion: '1.0'
type: tabsdatak.conn.mysql:MySQLSrcConn
spec:
  uri: mysql://127.0.0.1:3306/testing
  credentials:
    kind: userPasswordCredentials
    apiVersion: '1.0'
    type: tabsdatak.conn.common.types:UserPassword
    spec:
      user: admin
      password: tabsdata
```

### Publishing data from a MySQL Database

```
from tabsdatak.api import TableFrameSpec, publisher
from tabsdatak.conn.mysql import MySQLSrc


@publisher(
    source=MySQLSrc(queries=["select * from CUSTOMERS"]),
    output_tables=["customers"],
)
def pub(customers: TableFrameSpec) -> TableFrameSpec:
    return customers
```

### Subscribing, transforming and publishing data within Tabsdata

```
from tabsdatak.api import TableFrameSpec, transformer
from tabsdatak.tableframe.functions import col


@transformer(
    input_tables=["input/customers"],
    output_tables=["spanish"],
)
def tfr(customers: TableFrameSpec) -> TableFrameSpec:
    return customers.filter(col("nationality").eq("spanish")).select(
        col("identifier"), col("name"), col("surname"), col("language")
    )
```

### Subscribing to data in an S3 Bucket

```
from tabsdatak.api import TableFrameSpec, subscriber
from tabsdatak.conn.s3 import S3Dest


@subscriber(
    destination=S3Dest(paths=["spanish.parquet"]),
    input_tables=["dataprod/spanish"],
)
def sub(spanish: TableFrameSpec) -> TableFrameSpec:
    return spanish
```

### Registering and Executing the Functions

Each function is registered in a collection, and triggering the publisher runs the rest:

```
$ tdk fn register --coll input --path input.py::pub
$ tdk fn register --coll dataprod --path transform.py::tfr
$ tdk fn register --coll output --path output.py::sub

$ tdk fn trigger --coll input --name pub
```

Every time the `pub` publisher is executed, the `tfr` transformer and the `sub` subscriber will also be
executed.
