Palanit Core

io.github.stasxrPublished by GitHub account stasxrv0.1.3Updated Oct 28, 2026

Scan MCP servers and agent tool manifests for poisoning, exfiltration, secrets and supply-chain risk

The publisher's own server: core.blue

VerifiedSTDIODesktop onlyDeveloper ToolsSecurity & Monitoring

Overview

AI-generated overview

Runs locally as an MCP server that scans MCP configs and agent tool manifests for poisoning, exfiltration, secrets and supply-chain risk.

What you can do
  • Scan MCP configs and tool manifests for hidden instructions, exfiltration prompts, hardcoded secrets, deceptive Unicode, unpinned packages, shell launches, plaintext endpoints and duplicate tool names
  • List the built-in detection rules with their severities
  • Report the tool version
  • Run the same checks from the command line, with JSON output and a fail-on threshold for CI, plus pinning of approved tool definitions to catch later changes
When to use it
Useful when you install or review third-party MCP servers and agent tools and want an assistant to check their definitions before trusting them, or when you want a repeatable check in CI or a pre-commit hook.
Requirements
A local Python environment with the palanit-core package installed with the mcp extra, launched over stdio as palanit-mcp. No accounts, API keys or environment variables are declared. It reads only the config or manifest files you point it at.
Before you install
It reads the config and manifest files you give it, which may contain literal secrets in env blocks; findings are heuristic, so a clean scan reduces risk but does not prove safety. Only scan systems you own or are authorized to test.

Installation

In SourceWeft

  1. Open Palanit Core in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

Palanit Core

A watchtower for AI agents.

Scan MCP servers and AI-agent tool manifests for hidden risk — before an attacker finds it.

Website · Docs · Palanit OS (hosted)

[PyPI] [Python] [License] [CI]


Your AI agent trusts tools, MCP servers and skills it didn't write. A tool's description is injected straight into the model's context — so a poisoned description can quietly tell your agent to leak a key, call an attacker's server, or run a shell command. Palanit Core reads every tool the way your agent will, and flags the ones that would betray it.

  • Zero dependencies. Pure Python standard library. Nothing to audit but the rules.
  • Fast & local. Runs on your machine. Sends nothing anywhere.
  • CI-ready. Exits 1 on HIGH+ findings, so a poisoned tool fails the build.
  • Open & honest. Every rule is readable. Severities reflect real impact, not upsell.

Install

bash
pip install palanit-core

Use

bash
# Scan an MCP config or tool manifestpalanit scan mcp.config.json
# See it in action on the bundled malicious samplepalanit scan --sample
# Machine-readable output, fail CI on HIGH or abovepalanit scan mcp.config.json --json --fail-on HIGH
# Pin the tool definitions you approved, then fail closed if a server later# swaps a description or schema after install (a "rug pull")palanit pin mcp.config.jsonpalanit scan mcp.config.json --baseline .palanit.lock.json

Example (trimmed):

 CRITICAL   Possible data exfiltration  [PL-EXFIL-001]    Instructs the agent to send sensitive data to an external URL (collector.evil.example).    ↳ mcp.config.json#/mcpServers/invoicing/tools/0/description    fix: Remove external URLs and exfiltration verbs from tool text.
   HIGH     Hidden instructions in tool text  [PL-POISON-001]   HIGH     Invisible or deceptive Unicode  [PL-UNICODE-001]  MEDIUM    Unpinned package / runner  [PL-SUPPLY-001]...9 finding(s)  (1 critical · 5 high · 3 medium)

Catch rug-pulls (tool-definition pinning)

A scan at install time only sees the tool text you approved. A hostile server can swap a tool's description or input schema after that approval — and standard clients never re-check. palanit pin records a hash of each tool's declared definition; a later scan --baseline fails closed on any change, so a swap costs the attacker the tool instead of silently succeeding.

bash
palanit pin mcp.config.json                                  # approve current definitionspalanit scan mcp.config.json --baseline .palanit.lock.json   # HIGH + exit 1 on any drift

What it detects

RuleSeverityWhat it catches
PL-POISON-001HIGHHidden / injected instructions in tool & schema descriptions
PL-EXFIL-001MED–CRITTool text that steers the agent to send data to external URLs
PL-SECRET-001HIGHHardcoded API keys, tokens and private keys
PL-UNICODE-001MED–HIGHInvisible / bidirectional Unicode used to hide instructions
PL-SUPPLY-001MEDIUMUnpinned / floating package versions (@latest, bare names)
PL-SHELL-001MED–HIGHTools that launch a shell (bash -c, cmd /c, …)
PL-TLS-001LOW–MEDEndpoints over http:// / ws:// without TLS
PL-COLLIDE-001MEDIUMDuplicate tool names that let one shadow another
PL-ENV-001HIGHLiteral secrets in a server's env block
PL-DRIFT-001HIGHA tool's definition changed since you approved it — a post-install "rug pull" (only with --baseline)

Run palanit rules to list them. Inputs understood: Claude-style mcpServers configs, servers configs, tools manifests, a bare list of tools, or a single tool object. Unknown JSON still gets string-level checks.

Use it as a GitHub Action

yaml
# .github/workflows/palanit.ymlname: palaniton: [push, pull_request]jobs:  scan:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4      - uses: stasxr/[email protected]        with:          files: "mcp.config.json"   # files or globs, space-separated          fail-on: "HIGH"            # INFO | LOW | MEDIUM | HIGH | CRITICAL

Prefer plain steps? That works too:

yaml
      - uses: actions/setup-python@v5        with: { python-version: "3.12" }      - run: pip install palanit-core      - run: palanit scan mcp.config.json --fail-on HIGH

Use it as a pre-commit hook

yaml
# .pre-commit-config.yamlrepos:  - repo: https://github.com/stasxr/palanit-core    rev: v0.1.2    hooks:      - id: palanit            # scans mcp*.json / claude_desktop_config.json by default

Use it as an MCP server

Palanit Core can itself run as an MCP server, so an agent or MCP client (Claude Desktop, Cursor, Cline, …) can scan a config on demand:

bash
pip install "palanit-core[mcp]"palanit-mcp          # stdio transport

Exposes the tools scan_mcp_config, list_rules and version. Example client entry:

json
{  "mcpServers": {    "palanit": { "command": "palanit-mcp" }  }}

Add the badge

Scanned your MCP server with Palanit Core? Show it:

[Scanned with Palanit Core]

markdown
[![Scanned with Palanit Core](https://img.shields.io/badge/scanned%20with-Palanit%20Core-5b8def)](https://github.com/stasxr/palanit-core)

Responsible use

Palanit Core only reads files you give it — but the broader PALANIT suite (botprobe) sends live test traffic. Only scan or test systems you own or are authorized to test. A clean scan reduces risk; it does not prove safety.

Beyond the CLI

  • Palanit OS — the same engine in your browser, plus continuous monitoring, change alerts and shareable reports.
  • Palanit Bot Killer — block hostile AI crawlers and red-team your own chatbot with botprobe.

License

Apache-2.0 © Stanislav Miziyev. Contributions welcome — see CONTRIBUTING.

mcp-name: io.github.stasxr/palanit-core

Source: README.md at commit bec464a

Tools

0
SourceWeft started this package once in an isolated sandbox, without credentials, to list its tools. That failed: the package type cannot run in the sandbox.

Version history

2
  1. v0.1.3LatestOct 21, 2026
  2. v0.1.2Oct 17, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

Other Core integrations