Metadata-Version: 2.5
Name: panopticon-mcp
Version: 1.0.0
Summary: Local-first MCP behavior observatory. We don't watch you. We watch your MCPs.
Project-URL: Homepage, https://github.com/brnyxx/panopticon
Project-URL: Documentation, https://github.com/brnyxx/panopticon/tree/main/docs
Project-URL: Issues, https://github.com/brnyxx/panopticon/issues
Project-URL: Source, https://github.com/brnyxx/panopticon
Project-URL: Changelog, https://github.com/brnyxx/panopticon/blob/main/CHANGELOG.md
Project-URL: Security policy, https://github.com/brnyxx/panopticon/security/policy
Author: Panopticon contributors
License: MIT License
        
        Copyright (c) 2026 Panopticon contributors
        Portions Copyright (c) 2025 Bashaar Javaid (MCP-Sentinel) — see THIRD_PARTY_NOTICES.md
        
        Permission is hereby granted, free of charge, to any person obtaining a copy
        of this software and associated documentation files (the "Software"), to deal
        in the Software without restriction, including without limitation the rights
        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        copies of the Software, and to permit persons to whom the Software is
        furnished to do so, subject to the following conditions:
        
        The above copyright notice and this permission notice shall be included in all
        copies or substantial portions of the Software.
        
        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        SOFTWARE.
License-File: LICENSE
Keywords: mcp,model-context-protocol,observability,sandbox,security
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Console
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Security
Requires-Python: >=3.11
Requires-Dist: cryptography==50.0.1
Requires-Dist: httpx>=0.27
Requires-Dist: json5>=0.9
Requires-Dist: jsonschema>=4.22
Requires-Dist: keyring==25.7.0
Requires-Dist: packaging<26,>=25
Requires-Dist: pathspec<2,>=1.1.1
Requires-Dist: pillow>=10.3
Requires-Dist: pyahocorasick>=2.1
Requires-Dist: pydantic>=2.7
Requires-Dist: pyyaml>=6.0
Requires-Dist: rich>=13.7
Requires-Dist: structlog>=24.1
Requires-Dist: tomli>=2.0; python_version < '3.11'
Requires-Dist: typer>=0.12
Provides-Extra: dev
Requires-Dist: hypothesis>=6.100; extra == 'dev'
Requires-Dist: mypy>=1.10; extra == 'dev'
Requires-Dist: pre-commit>=3.7; extra == 'dev'
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
Requires-Dist: pytest-timeout>=2.3; extra == 'dev'
Requires-Dist: pytest>=8.2; extra == 'dev'
Requires-Dist: ruff>=0.5; extra == 'dev'
Requires-Dist: types-jsonschema>=4.22; extra == 'dev'
Requires-Dist: types-pyyaml; extra == 'dev'
Provides-Extra: semantic
Requires-Dist: openai>=1.30; extra == 'semantic'
Provides-Extra: static
Requires-Dist: semgrep==1.175.0; extra == 'static'
Provides-Extra: upstream
Requires-Dist: openai==2.46.0; extra == 'upstream'
Requires-Dist: platformdirs<5,>=4.10; extra == 'upstream'
Requires-Dist: sarif-om<2,>=1.0.4; extra == 'upstream'
Requires-Dist: tiktoken<1,>=0.12; extra == 'upstream'
Description-Content-Type: text/markdown

<div align="center">

<img src=".github/assets/logo.svg" alt="Panopticon logo: a panopticon floor plan drawn as an eye, one cell lit in orange" width="96"/>

<img src=".github/assets/hero.svg" alt="Panopticon — We don't watch you. We watch your MCPs. A local-first MCP behavior observatory." width="920"/>

[![Version](https://img.shields.io/badge/version-1.0.0-orange?style=flat-square&labelColor=0A0E1A)](docs/release.md) [![Python](https://img.shields.io/badge/python-3.11%2B-4B8BBE?style=flat-square&labelColor=0A0E1A)](pyproject.toml) [![Platform](https://img.shields.io/badge/platform-macOS%20%7C%20Linux%20%7C%20WSL2-8B98B8?style=flat-square&labelColor=0A0E1A)](panopticon-buildplan.md) [![License](https://img.shields.io/badge/license-MIT-E8EDF7?style=flat-square&labelColor=0A0E1A)](LICENSE) [![No telemetry](https://img.shields.io/badge/telemetry-none-2EA043?style=flat-square&labelColor=0A0E1A)](#principles)

</div>

`pano` finds the MCP servers installed in your AI clients, runs them inside a decoy-filled sandbox, and shows you what they *actually* did — file by file, host by host, per tool call — against what they *claim* to do.

```
$ pano watch github

Ran github MCP in an isolated sandbox and called 3 tools. (14s)

list_issues
  READ   ~/.gitconfig
  READ   ~/.ssh/config                        not declared
  NET    api.github.com:443
  NET    collector.example-telemetry.io:443    not in docs
  LEAK   AWS_ACCESS_KEY_ID sent to host above  <- decoy value

Declared   repo read/write (README, tool descriptions)
Observed   2 files · 2 hosts · 1 decoy leak

Findings   2 undeclared behaviors, 1 leak
           details: pano explain WATCH-003 WATCH-001
```

<div align="center">

<img src=".github/assets/panopticon.png" alt="An inspection tower at the centre of a ring of cells, each holding an MCP server. One beam catches a single cell mid-reach for a key." width="860"/>

</div>

## Install

```bash
uvx panopticon-mcp doctor        # discovery + config checks, no Docker needed
uvx panopticon-mcp watch --all   # needs Docker or Podman
```

See the [release, installation, upgrade, and rollback guide](docs/release.md) for pinned `uvx`,
`pipx`, Homebrew, and native archive instructions.

## Principles

1. Observation before judgment — we report what happened; you decide.
2. Unknown is visible — anything not observed, skipped, unsupported, or timed out is reported as UNKNOWN or INCOMPLETE, never collapsed into a pass.
3. Your home never enters a container — decoys only. No telemetry, no crash reports, no update pings. One opt-in exception leaves your machine: `scan --mode deep` submits redacted source excerpts to the OpenAI API under your own key, shown to you before they are sent, and `--offline` disables it. Details in [`docs/privacy.md`](docs/privacy.md).

## Status

The 1.0 contracts and artifacts are built from the implementation plan; release-channel status and
remaining external promotion work are tracked in [`docs/PROGRESS.md`](docs/PROGRESS.md). Agents:
read [`AGENTS.md`](AGENTS.md).

## Lineage

The static, semantic, and dependency analysis assets in the `scan` line come from [MCP-Sentinel](https://github.com/BashaarJavaid/MCP-Sentinel) at commit [`e717e955`](https://github.com/BashaarJavaid/MCP-Sentinel/commit/e717e955210b1d2a3e9fb1cdc266587c77ffebf3) (MIT), carried here with the original copyright headers intact and the exact file list in [`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md). Dynamic behavior is not inherited: Panopticon's own sandbox and decoy-probe engine replaces upstream dynamic probing entirely.

## License

MIT.
